超时运行的Bash脚本不会在SIGINT上退出
我有一个 bash 脚本,它在 for 循环中(在超时条件下)调用另一个 bash 脚本,格式如下:
#!/bin/bash
trap 'trap - SIGTERM && kill 0' SIGINT SIGTERM EXIT
INNER_SCRIPT_PATH="./inner_script.sh"
for file in "$SAMPLEDIR"/*
do
if [[ "${file: -4}" == ".csv" ]]; then
CSVPATH="$file"
CSVNAME=${CSVPATH##*/} # extract file name
CSVNAME=${CSVNAME%.*} # remove extension
timeout -k 10s 30m bash "$INNER_SCRIPT_PATH"
fi
done
wait
按 Ctrl-C 并不会退出所有进程,我有一种感觉,我在这里调用内部 bash 脚本的方式可能有问题(尤其是超时)。将不胜感激有关如何使这更好的反馈!
回答
问题在于timeout命令,它使您的脚本不受 Ctrl+C 调用的影响。由于默认情况下timeout在它自己的进程组中而不是在前台进程组中运行,因此它不受从交互式终端调用的信号的影响。
您可以运行它--foreground以接受来自交互式 shell 的信号。请参见超时手册页