1

「nohupped」を実行するシェル スクリプト バックグラウンド プロセスがあります。このプロセスはトラップでシグナルを受信しますが、いくつかのコードをいじっていると、シグナル間の間隔が小さすぎると一部のシグナルが無視されることに気付きました。トラップ関数の実行に時間がかかりすぎるため、後続のシグナルが処理されなくなります。残念ながら、trap コマンドにはある種のシグナル キューがありません。そのため、この問題を解決する最善の方法は何ですか?

簡単な例:

function  receive_signal()
{
local TIMESTAMP=`date '+%Y%m%d%H%M%S'`
echo "some text" > $TIMESTAMP
}

trap receive_signal USR1

while :
do 
   sleep 5
done
4

2 に答える 2

2

アプローチを再設計せずに行う最も簡単な変更は、キューに入れるリアルタイム シグナルを使用することです。

これはポータブルではありません。リアルタイム シグナル自体はオプションの拡張機能であり、それらに対するシェルとユーティリティのサポートは、いずれの場合も拡張機能には必要ありません。ただし、関連する Linux 上の GNU ユーティリティ (bash(1)およびkill(1))、常識的な方法でリアルタイム シグナルをサポートしている場合があります。したがって、次のように言えます。

trap sahandler RTMIN+1

そして、他の場所:

$ kill RTMIN+1 $pid_of_my_process
于 2012-11-14T15:38:05.437 に答える
1

複数の1行トラップステートメントを検討しましたか?ブロックまたは処理する信号ごとに1つですか?

trap dosomething 15
trap segfault    SEGV

また、発生したばかりの理由から、シグナルハンドラーにできるだけ少ないコードを含める必要があります。

編集-bashの場合、Cで独自のエラー処理/信号処理をコーディングできます。動的にロード可能なモジュールが必要な場合は、最新の信号セマンティクスを使用してコーディングできます。

http://cfajohnson.com/shell/articles/dynamically-loadable/

于 2012-11-14T01:09:48.697 に答える