Linuxプロセスは子プロセスに送信された信号を傍受できますか?

Linuxプロセスは子プロセスに送信された信号を傍受できますか?

大きな実行可能ファイル用のシェルラッパーがあります。これは次のことを行います。

run/the/real/executable "$@" &
PID=$!
# perform
# a few
# minor things
wait $PID
# perform some
# post-processing

後で行うことの1つwaitは、コアダンプを確認してプロセスの競合を処理することです。ただし、その時点ではプロセスが終了し、一部の情報を使用できなくなります。

シェルスクリプトが致命的なシグナルを子プロセス自体に渡す前にSIGSEGV傍受できますか?SIGBUS

lsof -p $PIDたとえば、ラッパープロセスが終了する前に開いたファイルのリストを取得するために実行できました。

修正するstrace:信号を受信する過程をキャプチャして使ってみました。残念ながら競争があるようです。子供の信号が報告されたら、子供は外に出てファイルリストを取得できるかstraceどうかわかりません...lsof

/bin/sleepこれは、書き込み用に開いているファイルを作成して取得しようとするテストスクリプトです。時には/tmp/sleep-output.txt正常に報告され、時にはリストが空になることもあります。

ulimit -c 0
/bin/sleep 15 > /tmp/sleep-output.txt &

NPID=$!

echo "Me: $$, sleep: $NPID"

(sleep 3; kill -BUS $NPID) &

ps -ww $NPID
while read line
do
        set -x
        outputfiles=$(lsof -F an -b -w -p $NPID | sed -n '/^aw$/ {n; s,.,,; p}')
        ps -ww $NPID
        lsof -F an -b -w -p $NPID
        break
done < <(strace -qq -p $NPID -e trace=signal 2>&1)
echo $outputfiles

wait $NPID

ksh上記のテストでは、or(構文が機能するbashには)を使用する必要があります。< <(...)

答え1

私が知っている限り、あなたがやろうとしていることをすることができるシェル方法はなく、カスタムプログラムを使って行う必要があります。

使用ptrace()デバッガと同様にプロセスを監視します。プロセスがシグナルを受信すると停止し、ウォッチャーに通知が送信されます(対応する呼び出しはwait()返され、WIFSTOPPED(status)trueになります)。

その後、実行してlsof -p <pid>プロセスのオープンファイルを一覧表示し、呼び出してptrace(PTRACE_CONT, pid, NULL, 0)プロセスを再起動できます。

関連情報