8

バックグラウンドで開始している bash プロセスのトラップを設定する必要があります。バックグラウンド プロセスは非常に長く実行される可能性があり、その PID が特定のファイルに保存されます。

ここで、そのプロセスにトラップを設定する必要があるため、プロセスが終了すると PID ファイルが削除されます。

それを行う方法はありますか?

編集#1

問題の説明が十分に正確ではなかったようです。私はすべてのコードを完全に制御できますが、実行時間の長いバックグラウンド プロセスは次のとおりです。

cat /dev/random >> myfile&

このステートメントが入っているスクリプトの先頭にトラップを追加すると、$$ここで開始しているこの小さなバックグラウンド プロセスの PID ではなく、より大きなスクリプトの PID になります。

では、そのバックグラウンド プロセスに具体的にトラップを設定するにはどうすればよいでしょうか。

4

4 に答える 4

3
(./jobsworthy& echo $! > $pidfile; wait; rm -f $pidfile)&
disown
于 2011-03-07T00:34:19.790 に答える
0

バックグラウンドプロセスの終了後にコマンドを実行する必要はありませんtrap。代わりに、シェルコマンドラインを実行し、バックグラウンドプロセスの後に、セミコロンで区切ってコマンドを追加できます(このシェルをバックグラウンドではなくバックグラウンドで実行します)。処理する)。

それでもシェルスクリプトで通知を送信したい場合はtrap SIGUSR2、たとえば次のようにします。

#!/bin/sh

BACKGROUND_PROCESS=xterm         # for my testing, replace with what you have

sh -c "$BACKGROUND_PROCESS; rm -f the_pid_file; kill -USR2 $$" &

trap "echo $BACKGROUND_PROCESS ended" USR2

while sleep 1
do
    echo -n .
done
于 2011-03-20T00:12:38.530 に答える
0

Peteshの回答ですでに示されているように、明示的なサブシェルで長時間実行されるバックグラウンド プロセスを実行し、この特定のサブシェル内にトラップを設定して、長時間実行されるバックグラウンド プロセスの終了を処理できます。親シェルは、このサブシェル トラップの影響を受けません。

(
trap '
  trap - EXIT ERR
  kill -0 ${!} 1>/dev/null 2>&1 && kill ${!}
  rm -f pidfile.pid
  exit
' EXIT QUIT INT STOP TERM ERR
# simulate background process
sleep 15 & 
echo ${!} > pidfile.pid
wait
) &
disown

# remove background process by hand
# kill -TERM ${!}
于 2013-03-17T17:16:03.563 に答える
0

これを Bash スクリプトの先頭に追加します。

#!/bin/bash
trap 'rm "$pidfile"; exit' EXIT SIGQUIT SIGINT SIGSTOP SIGTERM ERR
pidfile=$(tempfile -p foo -s $$)
echo $$ > "$pidfile"
# from here, do your long running process
于 2011-03-07T00:48:25.363 に答える