11

この質問は、次のようなスクリプトに適用されます。

脚本

#!/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プロセスは終了しません。

4

2 に答える 2

16

トラップを作成し、トラップCtrl+c内ですべてのサブプロセスを強制終了します。あなたのwait命令の前にこれを置いてください。

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

trap handle_sigint SIGINT
于 2011-10-19T07:34:57.487 に答える
0

簡単な代替手段は、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 の動作を保証する最も簡単な方法は、スクリプト全体をそのようなサブシェルにラップすることです。

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

これがアンドリューの答えとまったく同じ効果があるかどうかはわかりません(つまり、サブプロセスに送信されるシグナルがわかりません)。また、ネイティブの Linux シェルではなく、cygwin でのみテストしました。

于 2014-02-07T14:16:31.250 に答える