web-dev-qa-db-ja.com

サブプロセスのCtrl + cは、スクリプトの前半でNohupされたプロセスを強制終了します

これがSO(コーディングのバグであるため)に属するかどうかはわかりませんでしたが、使用するソフトウェアの微妙さについてはもっと知識があると思いました(したがって、U&Lでさえ検討できるかもしれません)。 )。

これが最小限のコードスクリプトです(完全なスクリプトについては編集を参照してください。私がこのようにしている理由があります)。

#/bin/bash
Nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &

less +F currentOutput.log

それがしようとしているのは、ログファイルに出力するサーバーをバックグラウンドで実行することです。
次に、less +Fを使用してそのログファイルをfollowします。あなたがするように、これを終了するには、あなたはヒットする必要があります ctrl+c あなたが打つことができる前に Q

何が起こるか、私が ctrl+clessコマンド内(tailingを停止するため)では、上部のNohupで開始されたサーバーがどういうわけか強制終了されます!他に影響はありません。私はできる shift+f ログのテーリングを再開し(サーバーが強制終了されたため、新しい情報は取得されません)、 Q スクリプトの残りの部分は正常に実行されます。

なぜこれが起こるのか知っていますか?それを回避する方法/私が使用すべき他の何か?


P.S.
サーバープログラムが^Cをリッスンしている可能性があります。これが問題である可能性があります。それを止めるために私にできることはありますか?たとえば、{SERVERCOMMAND}を単独で(ブロック方式で)実行すると、ヒットする可能性があります。 ctrl+c、すぐにそれを殺すことはありません。 Received ^C signal, shutting downを出力します(その後、自分自身を強制終了します)。これは、私がless^Cしたときに起こっていることです(最後のReceived ^C signal, shutting downがログに書き込まれます)。


P.P.S
私はいくつかのことを試みてきました(どれもうまくいきませんでした)。

  • 変更してstdinをスクリプトから切断しようとしています

    Nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &
    to
    Nohup echo '' | {SERVERCOMMAND} > currentOutput.log 2>&1 &
    or
    Nohup cat /dev/null/ | {SERVERCOMMAND} > currentOutput.log 2>&1 &
    
  • stty intr ^Gを使用して割り込みコマンドを置き換えますが、その後 ctrl+g とにかく^Cが行っていたことを正確に実行しました(したがって、これは代わりに私のターミナルエミュレータで問題になる可能性があります; konsole

  • Nohup&/またはless行を括弧で囲みます(サブシェルにするため)

  • xtermではなくkonsoleでスクリプトを実行する

15
Hashbrown

SIGINTがすべてのプロセスに送信されたのは正しいと思っていました。 ctrl+c、しかし、別のプロセスを作成すると、それがprocess groupの外に出ると考えるのはばかげていました(P.P.S.での私の試みを参照してください)。

This は、正確なユースケースであるだけでなく、正しい解決策でもあります。

私のスクリプトがどのように構成されているかという理由で、答えは逐語的に適合しませんでした。これが現在のスクリプトです。

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

サーバーは、Iの後もログファイルに出力し続けます ctrl+clessで。

みなさん、ありがとうございました。

11
Hashbrown

勘当を試しましたか?

  disown -h %1

またはあなたの仕事が何であれ; disownはシェル組み込みであり、その manページ は次のように述べています。

勘当

否認[-ar] [-h] [jobspec ...]

オプションがない場合、各jobspecはアクティブなジョブのテーブルから削除されます。 -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the Shell receives a SIGHUP. If jobspec is not present, and neither the- a 'または-r' option is supplied, the current job is used. If no jobspec is supplied, the- a 'オプションは、すべてのジョブを削除またはマークすることを意味します。 jobspec引数のない `-r 'オプションは、操作を実行中のジョブに制限します。

[〜#〜]編集[〜#〜]

面白いことに、あなたの構築は私のArchLinuxで機能します。

 $ cat testm
  #!/bin/sh

  Nohup /home/mario/temp/waste & 

  less +F out.log

 $ cat waste
  #!/bin/sh

  while [ 1 ]; do
    find / -print 2>1 1> out.log
  done
  $ ./testm
   Nohup: appending output to ‘Nohup.out’
  $ ps ax | grep waste
    19090 pts/2    S      0:00 /bin/sh /home/mario/temp/waste
    19124 pts/2    S+     0:00 grep waste]
  $

psコマンドの前に、out.logファイルをスクロールする必要がありました。 Ctrl+C、その後 q

0
MariusMatutiae