【问题标题】:Bash script run with timeout won't exit on SIGINT超时运行的 Bash 脚本不会在 SIGINT 上退出
【发布时间】:2021-08-31 22:36:54
【问题描述】:

我有一个 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 脚本的方式可能有问题(尤其是超时)。非常感谢您就如何改进这一点提供反馈!

【问题讨论】:

    标签: bash shell timeout


    【解决方案1】:

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

    您可以使用--foreground 运行它以接受来自交互式外壳的信号。见timeout Man page

    【讨论】:

    • 谢谢!澄清一下,在timeout 之后添加--foreground 就足够了吗?
    • @V.Doe:应该是!您可以根据自己的情况对其进行测试