有些命令收到 TERM 后会做清理,但也可能一直不退出。GNU timeout 的 --kill-after 可以先给它一个正常收尾窗口,超过窗口再发 KILL。
环境:Linux、Bash 4.4+、GNU coreutils 9.x。保存为 worker.sh:
#!/usr/bin/env bash
set -Eeuo pipefail
trap 'printf "got TERM, but keep running\n" >&2' TERM
while :; do
sleep 1
done
验证命令:
chmod +x worker.sh
set +e
timeout --signal=TERM --kill-after=1s 2s ./worker.sh
status=$?
set -e
printf 'exit=%s\n' "$status"
test "$status" -eq 137
这里运行 2 秒后先发 TERM,脚本故意不退出;再等 1 秒,timeout 用 KILL 结束它,所以状态是 137。实际任务如果能在 TERM 后正常收尾,就不会走到强制终止。这个参数是 GNU coreutils 的用法,macOS 自带环境不能直接照搬。