シェル スクリプト内の一連のコマンドを、他のプロセスによって中断されることなく実行するにはどうすればよいですか?
質問する
222 次
2 に答える
0
つまり、プリエンプトされずに?とんでもない。カーネル スケジューラは、実行するタスクをいつでも自由に選択できます。
ただし、Linux では、「リアルタイム」の優先度 (つまり、SCHED_FIFO または SCHED_RR) を設定して、優先度の低いタスクを実行するためにスクリプトが中断されないようにすることができます。
于 2013-10-25T12:45:17.310 に答える
0
シェルプロセスに割り込みやその他のシグナルを無視させる方法を尋ねている場合、答えはtrap
コマンド経由です。
trap "" 2
また:
trap "" INT
その動作をキャンセルするには、文字列に何もリストしないでください。
trap 2
trap INT
割り込み (および関連するシグナル) で一時ファイルを削除する必要がある場合は、次のようなものを使用できます。
tmp=$(mktemp ${TMPDIR:-/tmp}/name.XXXXXX)
trap "rm -f $tmp; exit 1" 0 1 2 3 13 15 # EXIT HUP INT QUIT PIPE TERM
...do operations using temporary files...
rm -f $tmp
trap 0 # Cancel the exit trap
示されているシグナルのセットは、ほとんどの通常のイベントをカバーする、かなり包括的なセットです。SIGKILL ( ) が送信された場合kill -9
、一時的なものはそのまま残ります — できることは何もありません。このmktemp
コマンドはファイルを安全に作成しますが (なぜ必要なのmktemp
かを参照してください)、実際には、ファイルが作成されてから、スクリプトが中断されて一時ファイルが放置されるようにトラップが設定されるまでの間に、わずかな機会が残されます。
于 2013-10-25T13:09:39.757 に答える