長いLinuxプログラムをリモートマシンで実行していて、それを停止したいのですが、killコマンドを使用すると、結果を保存せずにプログラムが終了するという問題があります。通常、プログラムを終了するために行うことはctrl cを使用することです。その場合、プログラムは結果を保存しますが、現在はセッションを実行しているマシンにいないため、ctrl cを実行できません。
私の質問は次のとおりです。ctrlcに相当する方法をリモートで実行する方法はありますか。
試してください:
kill -SIGINT processPIDHere
基本的に Ctrl C 送信するシグナルを指定しない限り、killはデフォルトでSIGINT
(終了)シグナルを送信しますが、SIGTERM
(割り込み)シグナルを送信します。
ctrl cはSIGINTシグナルを送信するだけですが、もう少しソフトなシグナルがいくつかあります。 http://www.gnu.org/software/libtool/manual/libc/Termination-Signals.html
Killコマンドを使用して他の信号を送信できると思います。 (詳細はman killをご覧ください)
長時間実行されるリモートプロセスを制御する場合、SIGTERMのシグナルハンドラをインストールできます(man signal
およびman sigaction
および多くのSOの質問)、死ぬ前にきれいにクリーンアップするために。
それは非常に一般的なことです。
Mongodの例を次に示します
コマンドラインからデーモンを起動するには:
mongod &
じゃあ後で
kill -SIGINT `pgrep mongod`
シグナルハンドラーにも注意してください。これは、プログラムの残りの部分を破損することなく、その中で実行できることをveryに制限しているという点で、割り込みハンドラーのようなものです。ここでできる最善のことは、atomic_t "should_quit"変数を設定することです。
私は以下のようにやっています
killall -2 <ProgramName>
または
kill -2 <PID of your process>
私は信号の名前を忘れていました。つまり、ここではSIGINT/SIGKILLなので、killall -2またはkillall -9のような番号を使用しています