ソースを参照

first draft

main
Jan Lehnardt 1年前
コミット
b1e59e9d4a
5個のファイルの変更219行の追加1行の削除
  1. +116
    -1
      README.md
  2. +26
    -0
      lib.sh
  3. +26
    -0
      test.sh
  4. +25
    -0
      wait_for_pid_exit.sh
  5. +26
    -0
      wait_for_url.sh

+ 116
- 1
README.md ファイルの表示

@@ -1 +1,116 @@
README
# Jan’s Shell Utilities

I’m coming across having to write the same shell script bits occasionally, and I got tired of jumping backwards through my projects to find the latest version, so here is a repository.

## Goals

- Write once (here) and copypasta everywhere.
- sh compatible if possible


# Functions

## `wait_for_url $url $duration $iterations`

Wait for a particular URL to be available using `curl`. Wait `$duration` seconds between attempts, try `$iterations` times. Defaults to `1` seconds and `3` times.

Signature:

```shell
wait_for_url url<string> [iterations<int> duration<int>]
```

Usage:

```shell
source ./wait_for_url.sh

# try 3 times, 1s apart
wait_for_url http://127.0.0.1:5984

# try 5 times, 1s apart
wait_for_url http://127.0.0.1:5984 5 3

# try 5 times, 3s apart
wait_for_url http://127.0.0.1:5984 5 3
```

## `wait_for_pid_exit $pid $duration $iterations`

Wait for a particular PID to exit. Wait `$duration` seconds between attempts, try `$iterations` times. Defaults to `1` seconds and `3` times.

Signature:

```shell
wait_for_pid_exit pid<int> [iterations<int> duration<int>]
```

Usage:

```shell
source ./wait_for_pid_exit.sh

# try 3 times, 1s apart
wait_for_pid_exit 3618

# try 5 times, 1s apart
wait_for_pid_exit 3618 5 3

# try 5 times, 3s apart
wait_for_pid_exit 3618 5 3
```

## `error_and_exit $message`

Prints an error message and then exits with exit code `1`.

Signature:

```shell
error_and_exit [message<string>]
```

Usage:

```shell

source ./lib

# print message, then exit
error_and_exit "this did not work"
```

TODO:
- make exit code variable
- probably as `error_and_exit "msg" 17`


## `assert_arg $arg`

Assert if a particular argument has been passed to a function. Combine with `&&` and `||` for error handling and setting of defaults for optional arguments.

Signature:

```shell
assert_arg arg<any>
```

Usage:

```shell
source ./lib.sh


# fail if arg is missing
function my_fun () {
assert_arg $1 && url=$1 || error_and_exit "error 'url' missing"
# now $url is available
}

# set arg to default value if missing
function my_fun () {
assert_arg $1 && iterations=$1 || iterations=5
# now $iterations is available
}

```

+ 26
- 0
lib.sh ファイルの表示

@@ -0,0 +1,26 @@

function debug () {
if [ -n "$DEBUG" ]; then
echo "$1"
fi
}

function debug_inline () {
if [ -n "$DEBUG" ]; then
printf "$1"
fi
}

function error_and_exit () {
echo $1 || "error"
exit 1
}

function assert_arg () {
arg=$1

if [ -z "$arg" ]; then
return 1
fi
return 0
}

+ 26
- 0
test.sh ファイルの表示

@@ -0,0 +1,26 @@
#!/bin/sh

#source ./wait_for_url.sh
#
# echo test1
# (wait_for_url)
# echo

# echo test2
# (wait_for_url http://localhost:8000 || echo "error reaching url")
# echo "test2 done"
#
# echo test3
# (wait_for_url http://localhost:8000 4)
# echo
#
# echo test4
# (wait_for_url http://localhost:8000 4 17)
# echo


source ./wait_for_pid_exit.sh

echo test5
(wait_for_pid_exit 45591 4 17)
echo "test5 done"

+ 25
- 0
wait_for_pid_exit.sh ファイルの表示

@@ -0,0 +1,25 @@

source ./lib.sh

function wait_for_pid_exit () {
assert_arg "$1" && pid="$1" || error_and_exit "pid not provided, exiting"
assert_arg "$2" && iterations="$2" || iterations=3
assert_arg "$3" && duration="$3" || duration=1

debug "called wait_for_url(pid=pid, duration=$duration, iterations=$iterations)"

waiting=0

debug_inline "waiting for $pid to exit "
until ( ! ps ax | grep $pid | grep -v grep > /dev/null); do
if [ $waiting -eq $iterations ]; then
let after=$duration*iterations
debug_inline "failed, $pid still running after $after seconds\n"
return 1
fi
debug_inline .
let waiting=waiting+1
sleep $duration
done
debug_inline " succeeded\n"
}

+ 26
- 0
wait_for_url.sh ファイルの表示

@@ -0,0 +1,26 @@

source ./lib.sh

function wait_for_url () {
assert_arg "$1" && url="$1" || error_and_exit "url not provided, exiting"
assert_arg "$2" && iterations="$2" || iterations=3
assert_arg "$3" && duration="$3" || duration=1

debug "called wait_for_url(url=$url, duration=$duration, iterations=$iterations)"

waiting=0
cmd="curl --output /dev/null --silent --insecure --head --fail --max-time 2 $url"

debug_inline "waiting for $url "
until ($cmd); do
if [ $waiting -eq $iterations ]; then
let after=$duration*iterations
debug_inline "failed, $url can not be reached after $after seconds\n"
return 1
fi
debug_inline .
let waiting=waiting+1
sleep $duration
done
debug_inline " succeeded\n"
}

読み込み中…
キャンセル
保存