by lr0 on 5/26/25, 11:34 AM with 97 comments
by majke on 5/26/25, 1:55 PM
$ strace -e trace=clone -e fault=clone:error=EAGAIN
random link: https://medium.com/@manav503/using-strace-to-perform-fault-i...by 0xbadcafebee on 5/27/25, 12:35 AM
That's for a standard service health check anyway. That service and health check shouldn't be started until the container it depends on has started and is healthy. In Kubernetes that's an Init Container in a Pod, in AWS ECS that's a dependsOn stanza in your Task Container Definition, and for Docker Compose it's the depends_on stanza in a Services entry.
set -eu
nowtime="$(date +%s)"
maxwait=300
maxloop=5
c=0
while [ $c -lt $maxloop ] ; do
if timeout "$maxwait" curl --silent --fail-with-body 10.0.0.1:8080/health ; then
exit 0
else
sleep 1
fi
if [ "$(date +%s)" -gt "$((nowtime+maxwait))" ] ; then
echo "$0: Error: max wait time $maxwait exceeded"
exit 1
fi
c=$((c+1))
done
However, Curl already supports this natively so there's no need to write a script. curl --silent --fail-with-body --connect-timeout 5 --retry-all-errors --retry-delay 1 --retry-max-time 300 --retry 300 10.0.0.1:8080/health
by robinhouston on 5/26/25, 7:56 PM
I haven’t quite been able to do it using _only_ builtins, but if you allow the sleep command (which has been standardised since the first version of POSIX, so it should be available pretty much anywhere that makes any sort of attempt to be POSIX compliant), then this seems ok:
# TIMEOUT SYSTEM
#
# Defines a timeout function:
#
# Usage: timeout <num_seconds> <command>
#
# which runs <command> after <num_seconds> have elapsed, if the script
# has not exited by then.
_alarm() {
local timeout=$1
# Spawn a subshell that sleeps for $timeout seconds
# and then sends us SIGALRM
(
sleep "$timeout"
kill -ALRM $$
) &
# If this shell exits before the timeout has fired,
# clean up by killing the subshell
subshell_pid=$!
trap _cleanup EXIT
}
_cleanup() {
if [ -n "$subshell_pid" ]
then
kill "$subshell_pid"
fi
}
timeout() {
local timeout=$1
local command=$2
trap "$command" ALRM
_alarm "$timeout"
}
# MAIN PROGRAM
times_up() {
echo 'TIME OUT!'
subshell_pid=
exit 1
}
timeout 10 times_up
for i in {1..20}
do
sleep 1
echo $i
done
by craigds on 5/26/25, 5:52 PM
by miduil on 5/26/25, 1:48 PM
for i in {0..60}; do
true -- "$i" # shelleck surpression
if eventually_succeeds; then break; fi
sleep 1s
done
Not super elegant, but relatively correct, next level is exponential back off. Generally leaves a bit of composability around.by aidenn0 on 5/26/25, 3:05 PM
bash -c 'some command "$1" "$2"' -- "$var1" "$var2"
I use "--" because I like the way it looks but the first parameter goes in argv[0] which doesn't expand in "$@" so IMO something other than an argument should go there for clarity.Note that bash specifically has printf %q which could alternatively be used, but I prefer to use bourne-compatible things when the bash version isn't significantly cleaner.
by noufalibrahim on 5/26/25, 2:35 PM
timeout 1800 mplayer show.mp4 ; sudo pm-suspend
As my poor man's parental control to let my kids watch a show for 30 minutes without manual supervision when they were younger. Useful commandby epr on 5/26/25, 4:38 PM
#!/usr/bin/env bash
long_fn () { # this can contain anything, like OPs until curl loop
sleep $1
}
# to TIMEOUT_DURATION BASH_FN_NAME BASH_FN_ARGS...
to () {
local duration="$1"; shift
local fn_name="$1"; shift
export -f "$fn_name"
timeout "$duration" bash -c "$fn_name"' "$@"' _ $@
}
time to 1s long_fn 5 # will report it ran 1 second
by pveierland on 5/26/25, 1:59 PM
by frou_dh on 5/26/25, 1:54 PM
by PeterWhittaker on 5/26/25, 2:51 PM
#!/usr/bin/env bash
runUntilDoneOrTimeout () {
local -i timeout=0
OPTIND=1
while getopts "t:" opt; do
case $opt in
t) timeout=$OPTARG;;
esac
done
shift $((OPTIND - 1))
runCommand="$*"
$runCommand &
runPID=$!
echo checking jobs
jobs # just to prove there are some
echo job check complete
while jobs %- >& /dev/null && ((timeout > 0)); do
echo "waiting for $runCommand for $timeout seconds"
sleep 1
((timeout--))
done
if (( timeout == 0 )); then
echo "$runCommand timed out"
kill -9 $runPID
wait $runPID
else
echo "$runCommand completed"
fi
echo checking jobs
jobs # just to prove there are none
echo job check complete
}
declare -i timeopt=10
declare -i sleepopt=100
OPTIND=1
while getopts "t:s:" opt; do
case $opt in
t) timeopt=$OPTARG;;
s) sleepopt=$OPTARG;;
esac
done
shift $((OPTIND - 1))
runUntilDoneOrTimeout -t $timeopt sleep $sleepopt
by oso2k on 5/26/25, 10:13 PM
timeout 5 bash -c 'cat < /dev/null > /dev/tcp/google.com/80'
Replace google.com and port 80 with your web or tcp server (ssh too!). The command will error/time out if there isn’t a server listening or you have some firewall/proxy in the way.by minaguib on 5/26/25, 2:46 PM
by arjie on 5/26/25, 5:43 PM
by chii on 5/26/25, 1:47 PM
You dont need to timeout here, and you won't need to subshell another bash to just get the timeout to work.
by sllabres on 5/26/25, 6:43 PM
by febusravenga on 5/26/25, 6:10 PM
This is very complex, because if you.write lots of functions that call functions, you really just want to run something that inherits while env from your process, that's why there is control and sleep process and naive race to decide which finished first...
That's probably reason I ignored built-in timeout...
by broken_broken_ on 5/27/25, 5:11 AM
It’s more useful if you are implementing this in a general programming language, not in the shell, or if you want to know how it works under the hood.
by AtlasBarfed on 5/26/25, 2:44 PM
Is there an attempt anywhere to build a slightly modern standard library for bash scripts?
You know besides stack overflow?
by linsomniac on 5/26/25, 11:39 PM
by lzy on 5/27/25, 2:20 AM
by tryauuum on 5/26/25, 4:01 PM
by js2 on 5/26/25, 5:35 PM
by linsomniac on 5/26/25, 11:38 PM
by anotherevan on 5/26/25, 10:05 PM
by kazinator on 5/28/25, 2:12 AM
That saves you a whole character of typing:
until command ; do ... done
-->
while ! command; do ... done
by deafpolygon on 5/27/25, 7:16 AM
--connect-timeout <seconds>
and retry: --retry <num>
so you could do curl --retry 5 --connect-timeout 10
by yonatan8070 on 5/26/25, 5:07 PM
by leitasat on 5/26/25, 6:45 PM
by TacticalCoder on 5/26/25, 6:11 PM
Been working flawlessly since 20 years: so flawlessly that I don't remember how it works.