Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/slavaganzin/await

28Kb, small memory footprint, single binary that run list of commands in parallel and waits for their termination
https://github.com/slavaganzin/await

async bash ci cli command-line-tool devops fish parallel posix runner util wait zsh

Last synced: 6 days ago
JSON representation

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

Awesome Lists containing this project

README

        

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

# ![build](https://github.com/slavaGanzin/await/actions/workflows/build-and-release.yml/badge.svg)

### install
```bash
# 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
# 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
```bash
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
```bash
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
```bash
await "curl 'https://whatnot.ai' &>/dev/null && echo UP || echo DOWN" \
--forever --change --exec "ntfy send 'whatnot.ai \1'"
```

### Use as [concurrently](https://github.com/kimmobrunfeldt/concurrently)
```bash
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](https://memegenerator.net/img/instances/48173775.jpg)
```bash
await 'echo -n 10' 'echo -n $RANDOM' 'expr \1 + \2' --exec 'echo \3' --forever --silent
```

### Furiously wait for new iPhone in background process
```bash
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
```bash
sudo systemctl restart redis; await 'socat -u OPEN:/dev/null UNIX-CONNECT:/tmp/redis.sock' --exec 'redis-cli -s /tmp/redis.sock'
```

## --help
```bash
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
--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

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"

```