await
await copied to clipboard
28Kb, small memory footprint, single binary that run list of commands in parallel and waits for their termination
await
32K, small memory footprint, single binary that run list of commands in parallel and waits for their termination
linux install
curl -L https://github.com/slavaGanzin/await/releases/download/0.91/await -o /usr/local/bin/await
chmod +x /usr/local/bin/await
Arch Linux
yay -S await
macOS install
curl -L https://github.com/slavaGanzin/await/releases/download/0.9/await-macos -o /usr/local/bin/await
chmod +x /usr/local/bin/await
With await you can:
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'"
Use as concurrently
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
Substitute while substituting
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 [arguments] commands
# runs list of commands and waits for their termination
OPTIONS:
--help #print this help
--stdout -o #print stdout of commands
--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
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
EXAMPLES:
# 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"