{"id":15211179,"url":"https://github.com/slavaganzin/await","last_synced_at":"2025-09-03T14:47:51.694Z","repository":{"id":39585568,"uuid":"324334605","full_name":"slavaGanzin/await","owner":"slavaGanzin","description":"28Kb, small memory footprint, single binary that run list of commands in parallel and waits for their termination","archived":false,"fork":false,"pushed_at":"2025-08-26T15:29:27.000Z","size":6624,"stargazers_count":175,"open_issues_count":2,"forks_count":4,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-08-26T20:57:29.392Z","etag":null,"topics":["async","bash","ci","cli","command-line-tool","devops","fish","parallel","posix","runner","util","wait","zsh"],"latest_commit_sha":null,"homepage":"","language":"C","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/slavaGanzin.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2020-12-25T09:49:00.000Z","updated_at":"2025-08-26T15:28:56.000Z","dependencies_parsed_at":"2024-04-12T17:41:05.546Z","dependency_job_id":"dfb11e28-a530-4435-936c-5da5615d4007","html_url":"https://github.com/slavaGanzin/await","commit_stats":{"total_commits":219,"total_committers":1,"mean_commits":219.0,"dds":0.0,"last_synced_commit":"d9e62fff84daf5d08dffca2dd4137e6994a91a9a"},"previous_names":[],"tags_count":23,"template":false,"template_full_name":null,"purl":"pkg:github/slavaGanzin/await","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slavaGanzin%2Fawait","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slavaGanzin%2Fawait/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slavaGanzin%2Fawait/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slavaGanzin%2Fawait/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/slavaGanzin","download_url":"https://codeload.github.com/slavaGanzin/await/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/slavaGanzin%2Fawait/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":273460489,"owners_count":25109757,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-09-03T02:00:09.631Z","response_time":76,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["async","bash","ci","cli","command-line-tool","devops","fish","parallel","posix","runner","util","wait","zsh"],"created_at":"2024-09-28T08:20:32.277Z","updated_at":"2025-09-03T14:47:51.682Z","avatar_url":"https://github.com/slavaGanzin.png","language":"C","funding_links":[],"categories":[],"sub_categories":[],"readme":"# await\n 32K\tawait, small memory footprint, single binary that run list of commands in parallel and waits for their termination\n\n\u003c!-- DO NOT CHANGE THIS FILE IS GENERATED BY ./hooks/pre-commit --\u003e\n\n# ![build](https://github.com/slavaGanzin/await/actions/workflows/build-and-release.yml/badge.svg)\n\n\n### install\n```bash\n# recommended way (crossplatform)\nstew i slavaGanzin/await  # https://github.com/marwanhawari/stew\n# or\neget slavaGanzin/await --to /usr/local/bin/  # https://github.com/zyedidia/eget\n\n# nix\nnix-shell -p await\n\n# arch\nyay -S await\n\n# not recommended, but it works!\ncurl https://i.jpillora.com/slavaGanzin/await! | bash\n```\n\n### completions\nIt's a single binary distribution, so you need to do it yourself (or download from a release)\n```bash\n# bash\nawait --autocomplete-bash \u003e\u003e ~/.bashrc\n\n#zsh\nawait --autocomplete-zsh \u003e\u003e ~/.zshrc\n\n#fish\nawait --autocomplete-fish \u003e\u003e ~/.config/fish/completions/await.fish\n```\n\n# With await you can:\n### Take action on specific file type changes\n```bash\nawait 'stat **.c' --change --forever --exec 'gcc *.c -o await -lpthread'\n# you can filter with:\n`stat --format '%n %z' **; | grep -v node_modules`\n```\n\n\u003cimg src='demo/7.gif' width='100%'\u003e\u003c/img\u003e\n\n\n### Wait for FAANG to fail\n```bash\nawait 'whois facebook.com' \\\n      'nslookup apple.com' \\\n      'dig +short amazon.com' \\\n      'sleep 1 | telnet netflix.com 443 2\u003e/dev/null' \\\n      'http google.com' --fail\n```\n\n\u003cimg src='demo/1.gif' width='100%'\u003e\u003c/img\u003e\n\n\n### Notify yourself when your site down\n```bash\nawait \"curl 'https://whatnot.ai' \u0026\u003e/dev/null \u0026\u0026 echo UP || echo DOWN\" \\\n      --forever --change --exec \"ntfy send 'whatnot.ai \\1'\"\n```\n\n\u003cimg src='demo/2.gif' width='100%'\u003e\u003c/img\u003e\n\n\n### Use as [concurrently](https://github.com/kimmobrunfeldt/concurrently)\n```bash\nawait \"stylus --watch --compress --out /home/vganzin/work/whatnot/front /home/vganzin/work/whatnot/front/index.styl\" \\\n      \"pug /home/vganzin/work/whatnot/front/index.pug --out /home/vganzin/work/whatnot/front --watch --pretty 2\u003e/dev/null\" --forever --stdout --silent\n```\n\n\u003cimg src='demo/3.gif' width='100%'\u003e\u003c/img\u003e\n\n\n### [Substitute while substituting](https://memegenerator.net/img/instances/48173775.jpg)\n```bash\nawait 'echo -n 10' 'echo -n $RANDOM' 'expr \\1 + \\2' --exec 'echo \\3' --forever --silent\n```\n\n\u003cimg src='demo/4.gif' width='100%'\u003e\u003c/img\u003e\n\n### Furiously wait for new iPhone in background process\n```bash\nawait 'curl \"https://www.apple.com/iphone/\" -s | pup \".hero-eyebrow text{}\" | grep -v 12' --interval 1000 --change --daemon --exec 'ntfy send \"\\1\"'\n```\n\n\u003cimg src='demo/5.gif' width='100%'\u003e\u003c/img\u003e\n\n### Restart database and connect immediately after it become fully functional\n```bash\nsudo systemctl restart redis; await 'socat -u OPEN:/dev/null UNIX-CONNECT:/tmp/redis.sock' --exec 'redis-cli -s /tmp/redis.sock'\n```\n\n\u003cimg src='demo/6.gif' width='100%'\u003e\u003c/img\u003e\n\n### Watch command output with diff highlighting\n```bash\n# Like watch -d, highlight only the changing parts\nawait 'date +%s' --diff --forever --stdout --silent --interval 1000\n\n# Monitor API responses and highlight changes \nawait 'curl -s https://api.example.com/status | jq .counter' --diff --forever --stdout --silent\n\n# Watch file changes with visual diff\nawait 'wc -l *.log' --diff --change --forever --stdout\n```\n\n### Better stderr handling\n```bash\n# Suppress stderr without affecting pipes or command structure\nawait 'curl -s https://unreliable-api.com || echo failed' --no-stderr\n\n# Clean output even with noisy commands\nawait 'some-verbose-command' 'another-command' --no-stderr --stdout --silent\n```\n\n### Watch mode for clean monitoring\n```bash\n# Equivalent to: await 'uptime' -fVodE  \nawait 'uptime' --watch\n\n# Monitor system resources with clean diff output\nawait 'ps aux | head -10' --watch --interval 2000\n\n# Watch log file changes with highlighted differences\nawait 'tail -5 /var/log/system.log' --watch\n```\n\n## --help\n```bash\nawait [options] commands\n\n# runs list of commands and waits for their termination\n\n\nEXAMPLES:\n# wait until your deployment is ready\n  await 'curl 127.0.0.1:3000/healthz' \\\n\t'kubectl wait --for=condition=Ready pod it-takes-forever-8545bd6b54-fk5dz' \\\n\t\"docker inspect --format='{{json .State.Running}}' elasticsearch 2\u003e/dev/null | grep true\" \n\n# emulate watch https://linux.die.net/man/1/watch\n  await 'clear; du -h /tmp/file' 'dd if=/dev/random of=/tmp/file bs=1M count=1000 2\u003e/dev/null' -of --silent\n\n# action on specific file type changes\n  await 'stat **.c' --change --forever --exec 'gcc *.c -o await -lpthread'\n\n# waiting google (or your internet connection) to fail\n  await 'curl google.com' --fail\n\n# waiting only google to fail (https://ec.haxx.se/usingcurl/usingcurl-returns)\n  await 'curl google.com' --status 7\n\n# waits for redis socket and then connects to\n  await 'socat -u OPEN:/dev/null UNIX-CONNECT:/tmp/redis.sock' --exec 'redis-cli -s /tmp/redis.sock'\n\n# lazy version\n  await 'ls /tmp/redis.sock'; redis-cli -s /tmp/redis.sock\n\n# daily checking if I am on french reviera. Just in case\n  await 'curl https://ipapi.co/json 2\u003e/dev/null | jq .city | grep Nice' --interval 86400\n\n# Yet another server monitor\n  await \"curl 'https://whatnot.ai' \u0026\u003e/dev/null \u0026\u0026 echo 'UP' || echo 'DOWN'\" --forever --change\\\n    --exec \"ntfy send \\'whatnot.ai \\1\\'\"\n\n# waiting for new iPhone in daemon mode\n  await 'curl \"https://www.apple.com/iphone/\" -s | pup \".hero-eyebrow text{}\" | grep -v 12'\\\n --change --interval 86400 --daemon --exec \"ntfy send \\1\"\n\n\nOPTIONS:\n  --help\t\t#print this help\n  --stdout -o\t\t#print stdout of commands\n  --no-stderr -E\t#suppress stderr output from commands\n  --watch -w\t\t#equivalent to -fVodE (fail, silent, stdout, diff, no-stderr)\n  --silent -V\t\t#do not print spinners and commands\n  --fail -f\t\t#waiting commands to fail\n  --status -s\t\t#expected status [default: 0]\n  --any -a\t\t#terminate if any of command return expected status\n  --change -c\t\t#waiting for stdout to change and ignore status codes\n  --diff -d\t\t#highlight differences between previous and current output (like watch -d)\n  --exec -e\t\t#run some shell command on success;\n  --interval -i\t\t#milliseconds between one round of commands [default: 200]\n  --forever -F\t\t#do not exit ever\n  --service -S\t\t#create systemd user service with same parameters and activate it\n  --version -v\t\t#print the version of await\n  --autocomplete-fish\t#output fish shell autocomplete script\n  --autocomplete-bash\t#output bash shell autocomplete script\n  --autocomplete-zsh\t#output zsh shell autocomplete script\n\n\nNOTES:\n# \\1, \\2 ... \\n - will be subtituted with n-th command stdout\n# you can use stdout substitution in --exec and in commands itself:\n  await 'echo -n 10' 'echo -n $RANDOM' 'expr \\1 + \\2' --exec 'echo \\3' --forever --silent\n\u003c!-- DO NOT CHANGE THIS FILE IS GENERATED BY ./hooks/pre-commit --\u003e\n\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslavaganzin%2Fawait","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fslavaganzin%2Fawait","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fslavaganzin%2Fawait/lists"}