问题 Bash:当脚本终止时,如何终止脚本的子进程?


该问题适用于以下脚本:

脚本

#!/bin/sh

SRC="/tmp/my-server-logs"

echo "STARTING GREP JOBS..."
for f in `find ${SRC} -name '*log*2011*' | sort --reverse`
do
    (
        OUT=`nice grep -ci -E "${1}" "${f}"`
        if [ "${OUT}" != "0" ]
        then
            printf '%7s : %s\n' "${OUT}" "${f}"
        else
            printf '%7s   %s\n' "(none)" "${f}"
        fi
    ) &
done

echo "WAITING..."
wait

echo "FINISHED!"

目前的行为

紧迫 Ctrl+C 在控制台中终止脚本但不是已经运行的脚本 grep 流程。


8054
2017-10-19 07:00


起源



答案:


写一个陷阱 Ctrl+c 并在陷阱中杀死所有子进程。把它放在你的面前 wait 命令。

function handle_sigint()
{
    for proc in `jobs -p`
    do
        kill $proc
    done
}

trap handle_sigint SIGINT

16
2017-10-19 07:34



谢谢!效果很好!除了我的bash预期 function 之前 handle_sigint。 - Ivivi Vavava
我已经添加 function 到脚本。 - Andrew
好吧,这是一个问题:当脚本运行时 数以百计 的文件, 不是全部 流程立即启动(这很好)。可悲的是,这会导致终止 只是一小部分 进程的 Ctrl+C。我想, 在终止期间 在陷阱循环内,其他人开始了。建议? (在主循环之前移动陷阱及其功能没有帮助) - Ivivi Vavava
stackoverflow.com/questions/360201/... 看起来很有用 trap "kill 0" SIGINT 适用于我的机器。 - Andrew
注意:脚本的第一行需要阅读 #!/bin/bash不是 #!/bin/sh,为此工作。 - Fabian Tamp


答案:


写一个陷阱 Ctrl+c 并在陷阱中杀死所有子进程。把它放在你的面前 wait 命令。

function handle_sigint()
{
    for proc in `jobs -p`
    do
        kill $proc
    done
}

trap handle_sigint SIGINT

16
2017-10-19 07:34



谢谢!效果很好!除了我的bash预期 function 之前 handle_sigint。 - Ivivi Vavava
我已经添加 function 到脚本。 - Andrew
好吧,这是一个问题:当脚本运行时 数以百计 的文件, 不是全部 流程立即启动(这很好)。可悲的是,这会导致终止 只是一小部分 进程的 Ctrl+C。我想, 在终止期间 在陷阱循环内,其他人开始了。建议? (在主循环之前移动陷阱及其功能没有帮助) - Ivivi Vavava
stackoverflow.com/questions/360201/... 看起来很有用 trap "kill 0" SIGINT 适用于我的机器。 - Andrew
注意:脚本的第一行需要阅读 #!/bin/bash不是 #!/bin/sh,为此工作。 - Fabian Tamp


一个简单的替代方案是使用a cat 管。以下对我有用:

echo "-" > test.text; 
for x in 1 2 3; do 
    ( sleep $x; echo $x | tee --append test.text; ) & 
done | cat

如果我在最后一个数字打印到标准输出之前按Ctrl-C。如果文本生成命令需要很长时间,例如“find /”,它也可以工作,即它不仅通过cat连接到stdout,而且实际上是子进程。

对于广泛使用子进程的大型脚本,确保缩进的Ctrl-C行为的最简单方法是将整个脚本包装到这样的子shell中,例如:

#!/usr/bin/bash
(
    ...
) | cat

我不确定它是否与安德鲁的答案具有完全相同的效果(即我不确定将什么信号发送到子过程)。此外,我只使用cygwin测试了这个,而不是使用原生Linux shell。


0
2018-02-07 14:16