これが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
でスクリプトを実行する
SIGINT
がすべてのプロセスに送信されたのは正しいと思っていました。 ctrl+c、しかし、別のプロセスを作成すると、それがprocess group
の外に出ると考えるのはばかげていました(P.P.S.
での私の試みを参照してください)。
This は、正確なユースケースであるだけでなく、正しい解決策でもあります。
私のスクリプトがどのように構成されているかという理由で、答えは逐語的に適合しませんでした。これが現在のスクリプトです。
#/bin/bash
setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log
サーバーは、Iの後もログファイルに出力し続けます ctrl+cless
で。
みなさん、ありがとうございました。
勘当を試しましたか?
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。