サブプロセスでCtrl + cを押すと、スクリプトの前のnohupされたプロセスが強制終了されます


15

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

最小限のコードスクリプトを次に示します(完全なスクリプトの編集を参照してください。この方法で行う理由があります)。

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

less +F currentOutput.log

サーバーがバックグラウンドで実行され、ログファイルに出力されます。
次にfollow、そのログファイルを使用しless +Fます。これを終了するには、を押す前にctrl+をc押す必要がありますQ

起こるのは、コマンド内で(停止するために)I ctrl+ cを実行すると、先頭にあるサーバーが何らかの理由で強制終了されます。他に影響はありません。私がすることができます+ (サーバーが殺されているので、新たな情報を取得しない)、再びログを尾行開始とする私がヒットした場合、スクリプトの実行の残りの部分を正常に。lesstailingnohupshiftfQ

これが起こる理由を知っていますか?それを避ける方法/私が使用する必要がある他の何か?


PS
サーバープログラムは^C、問題の可能性があるをリッスンしている可能性があります。それを止めるために私にできることはありますか?たとえば{SERVERCOMMAND}、単独で(ブロッキング方式で)実行する場合、ctrl+をc押すとすぐに殺されません。印刷しますReceived ^C signal, shutting down(そして、それ自体を殺します)。これは私^Cが入るときに起こっていることですless(最終結果Received ^C signal, shutting downがログに書き込まれます)。


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

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

    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


誰かが私の問題に出くわしたかもしれません。I think it is due to the handling within the database software, not on the shell。プログラムはこれをどのように行いますか?それでは、どうすれば停止できますか?
ハッシュブラウン14年

3
nohupSIGHUPCTRL + CがSIGINTシグナルを送信するのに対し、プロセスはシグナルを受信しません。それnohupが、期待した効果が得られない理由です。
ピョートルドブロゴスト

回答:


11

私はそれが+のSIGINTときにすべてのプロセスに送信されていると考えていましたが、別のプロセスを作成するとそれが外部に出ると考えるのは愚かでした(の私の試みを参照)。ctrlcprocess groupP.P.S.

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

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

#/bin/bash

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

サーバーは、I ctrl+ cinの後もログファイルへの出力を続けますless

みんなの時間をありがとう。


0

あなたは否認しようとしたことがありますか?

  disown -h %1

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

否認する

disown [-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 'オプションは、実行中のジョブに操作を制限します。

編集

面白いことに、あなたの構築は私のArch Linuxで動作します:

 $ 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


はい、しかし、私はそれを適用する方法を知りません。nohupdisowns自体を関数内に配置しようとしましたが、それはと同じである必要がありnohupます。私はこれがあるとは思わないSIGHUP、私が削除したときのように、問題lessのスクリプトは、サーバーがまだ実行されていると結論付け、ラインを
Hashbrown

@ハッシュブラウンpls私の編集を参照してください
MariusMatutiae 14年

ええ、{SERVER}実行可能ファイルの代わりに単純なbashスクリプトを呼び出して、テストも行いました。そして、nohupはうまく機能しました。質問に対する私のコメントをご覧ください。何とか意図的に聴いていると思います。その妥当性(およびないよく知られている)私も誰かが行くことができますので、それが何であるかを言うことができないサーバー「ああ、そのは、Xをやって、あなたはYを行う必要がある」以来
Hashbrown
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.