Skip to content

28Kb, small memory footprint, single binary that run list of commands in parallel and waits for their termination

License

Notifications You must be signed in to change notification settings

slavaGanzin/await

Repository files navigation

await

28K await, small memory footprint, single binary that run list of commands in parallel and waits for their termination

build

install

# recommended way (crossplatform)
stew i slavaGanzin/await  # https://github.com/marwanhawari/stew
# or
eget slavaGanzin/await --to /usr/local/bin/  # https://github.com/zyedidia/eget

# nix
nix-shell -p await

# arch
yay -S await

# not recommended, but it works!
curl https://i.jpillora.com/slavaGanzin/await! | bash

completions

It's a single binary distribution, so you need to do it yourself (or download from a release)

# bash
await --autocomplete-bash >> ~/.bashrc

#zsh
await --autocomplete-zsh >> ~/.zshrc

#fish
await --autocomplete-fish >> ~/.config/fish/completions/await.fish

With await you can:

Take action on specific file type changes

await 'stat **.c' --change --forever --exec 'gcc *.c -o await -lpthread'
# you can filter with:
`stat --format '%n %z' **; | grep -v node_modules`

Wait for FAANG to fail

await 'whois facebook.com' \
      'nslookup apple.com' \
      'dig +short amazon.com' \
      'sleep 1 | telnet netflix.com 443 2>/dev/null' \
      'http google.com' --fail

Notify yourself when your site down

await "curl 'https://whatnot.ai' &>/dev/null && echo UP || echo DOWN" \
      --forever --change --exec "ntfy send 'whatnot.ai \1'"

await "stylus --watch --compress --out /home/vganzin/work/whatnot/front /home/vganzin/work/whatnot/front/index.styl" \
      "pug /home/vganzin/work/whatnot/front/index.pug --out /home/vganzin/work/whatnot/front --watch --pretty 2>/dev/null" --forever --stdout --silent

await 'echo -n 10' 'echo -n $RANDOM' 'expr \1 + \2' --exec 'echo \3' --forever --silent

Furiously wait for new iPhone in background process

await 'curl "https://www.apple.com/iphone/" -s | pup ".hero-eyebrow text{}" | grep -v 12' --interval 1000 --change --daemon --exec 'ntfy send "\1"'

Restart database and connect immediately after it become fully functional

sudo systemctl restart redis; await 'socat -u OPEN:/dev/null UNIX-CONNECT:/tmp/redis.sock' --exec 'redis-cli -s /tmp/redis.sock'

--help

await [options] commands

# runs list of commands and waits for their termination


EXAMPLES:
# wait until your deployment is ready
  await 'curl 127.0.0.1:3000/healthz' \
	'kubectl wait --for=condition=Ready pod it-takes-forever-8545bd6b54-fk5dz' \
	"docker inspect --format='{{json .State.Running}}' elasticsearch 2>/dev/null | grep true" 

# emulate watch https://linux.die.net/man/1/watch
  await 'clear; du -h /tmp/file' 'dd if=/dev/random of=/tmp/file bs=1M count=1000 2>/dev/null' -of --silent

# action on specific file type changes
  await 'stat **.c' --change --forever --exec 'gcc *.c -o await -lpthread'

# waiting google (or your internet connection) to fail
  await 'curl google.com' --fail

# waiting only google to fail (https://ec.haxx.se/usingcurl/usingcurl-returns)
  await 'curl google.com' --status 7

# waits for redis socket and then connects to
  await 'socat -u OPEN:/dev/null UNIX-CONNECT:/tmp/redis.sock' --exec 'redis-cli -s /tmp/redis.sock'

# lazy version
  await 'ls /tmp/redis.sock'; redis-cli -s /tmp/redis.sock

# daily checking if I am on french reviera. Just in case
  await 'curl https://ipapi.co/json 2>/dev/null | jq .city | grep Nice' --interval 86400

# Yet another server monitor
  await "curl 'https://whatnot.ai' &>/dev/null && echo 'UP' || echo 'DOWN'" --forever --change\
    --exec "ntfy send \'whatnot.ai \1\'"

# waiting for new iPhone in daemon mode
  await 'curl "https://www.apple.com/iphone/" -s | pup ".hero-eyebrow text{}" | grep -v 12'\
 --change --interval 86400 --daemon --exec "ntfy send \1"


OPTIONS:
  --help		#print this help
  --stdout -o		#print stdout of commands
  --no-stderr -E	#surpress stderr of commands by adding 2>/dev/null to commands (doesn't work with pipes)
  --silent -V		#do not print spinners and commands
  --fail -f		#waiting commands to fail
  --status -s		#expected status [default: 0]
  --any -a		#terminate if any of command return expected status
  --change -c		#waiting for stdout to change and ignore status codes
  --exec -e		#run some shell command on success;
  --interval -i		#milliseconds between one round of commands [default: 200]
  --forever -F		#do not exit ever
  --service -S		#create systemd user service with same parameters and activate it
  --version -v		#print the version of await
  --autocomplete-fish	#output fish shell autocomplete script
  --autocomplete-bash	#output bash shell autocomplete script
  --autocomplete-zsh	#output zsh shell autocomplete script


NOTES:
# \1, \2 ... \n - will be subtituted with n-th command stdout
# you can use stdout substitution in --exec and in commands itself:
  await 'echo -n 10' 'echo -n $RANDOM' 'expr \1 + \2' --exec 'echo \3' --forever --silent
<!-- DO NOT CHANGE THIS FILE IS GENERATED BY ./hooks/pre-commit -->