1

単純な nohup コマンドの動作がおかしいように見える問題があります。これを、Sleep という名前の小さな Java アプリに要約しました。

while (true) 
  Thread.sleep(10000).  

次のように nohup を実行しています。

nohup java Sleep.java >> nohup.log 2>&1 &

次に、別のウィンドウで strace を実行して、次のようにシグナルを探し、pid (12345) を探します。

strace -tt -p 12345 -enone -e 'signal=!sigchld'
Process 16582 attached - interrupt to quit

元のウィンドウで「exit」と入力してシェルを閉じると、シグナルを受信せずにプロセスが実行され続けることがわかります。ただし、パテ ウィンドウを閉じると (メニュー バーの [x] をクリック)、nohup されたプロセスが SIGHUP を取得することがわかります。

strace -tt -p 16582 -enone -e 'signal=!sigchld'
Process 16582 attached - interrupt to quit
14:54:03.271286 --- SIGINT (Interrupt) @ 0 (0) ---

nohup は SIGHUP をインターセプトする/渡さないはずだと思っていました。それ以来、setsid の使用に切り替えたので、ターミナル ウィンドウをどのように閉じても正しい動作が得られます。私は何か間違ったことをしていますか?私が取り組んでいる実際の問題で深刻な問題を引き起こしている nohup が正しく機能していないようです。

4

1 に答える 1

0

Java でこれを処理するには... スレッドはこれがどの OS でも動作することを示唆していますが、Windows にシグナルがあるとは思えないことに注意してください: Java で SIGINT を無視する

また、SIGHUP と SIGINT を無視する独自の nohup を作成することもできます。または、GNU nohup ソースをダウンロードして、SIGINT も無視するように変更することもできます。

とりあえず、これはおそらく Windows/パテの問題ではありません。

于 2012-07-20T21:07:15.270 に答える