大きな実行可能ファイル用のシェルラッパーがあります。これは次のことを行います。
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)
プロセスを再起動できます。