超时运行的 Bash 脚本不会在 SIGINT 上退出

V. *_*Doe 3 bash shell timeout

我有一个 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
Run Code Online (Sandbox Code Playgroud)

按 Ctrl-C 并不会退出所有进程,我有一种感觉,我在这里调用内部 bash 脚本的方式可能有问题(尤其是超时)。将不胜感激有关如何使这更好的反馈!

Ini*_*ian 5

问题在于timeout命令,它使您的脚本不受 Ctrl+C 调用的影响。由于默认情况下timeout在它自己的进程组中而不是在前台进程组中运行,因此它不受从交互式终端调用的信号的影响。

您可以运行它--foreground以接受来自交互式 shell 的信号。请参见超时手册页