该问题适用于以下脚本:
脚本
#!/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
流程。
写一个陷阱 Ctrl+c
并在陷阱中杀死所有子进程。把它放在你的面前 wait
命令。
function handle_sigint()
{
for proc in `jobs -p`
do
kill $proc
done
}
trap handle_sigint SIGINT
写一个陷阱 Ctrl+c
并在陷阱中杀死所有子进程。把它放在你的面前 wait
命令。
function handle_sigint()
{
for proc in `jobs -p`
do
kill $proc
done
}
trap handle_sigint SIGINT
一个简单的替代方案是使用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。