サーバーでnohupプロセスを実行しています。それを殺そうとすると、代わりにパテコンソールが閉じます。
これが私がプロセスIDを見つけようとする方法です。
ps -ef |grep nohup
これは殺すためのコマンドです
kill -9 1787 787
サーバーでnohupプロセスを実行しています。それを殺そうとすると、代わりにパテコンソールが閉じます。
これが私がプロセスIDを見つけようとする方法です。
ps -ef |grep nohup
これは殺すためのコマンドです
kill -9 1787 787
回答:
使用nohup
しているときにタスクをバックグラウンドで実行すると、バックグラウンド演算子(&
)によってコマンドプロンプトでPIDが表示されます。計画がプロセスを手動で管理することである場合、そのPIDを保存し、後でそれを使用して、必要に応じて、kill PID
またはkill -9 PID
(強制的に強制終了する必要がある場合)プロセスを強制終了できます。または、後でPID ps -ef | grep "command name"
を見つけて、そこからPIDを見つけることもできます。nohup
キーワード/コマンド自体はps
、問題のコマンドの出力には表示されないことに注意してください。
スクリプトを使用した場合、次のようなことができます。
nohup my_command > my.log 2>&1 &
echo $! > save_pid.txt
これにより、my_command
すべての出力がに保存されますmy.log
(スクリプトで$!
は、最後に実行されたプロセスのPIDを表します)。これ2
は、標準エラー(stderr
)のファイル記述子であり、2>&1
標準エラー出力を標準出力(ファイル記述子1
)にルーティングするようにシェルに指示します。必要です&1
、シェルがそれをその名前のファイルだけでなく、そのコンテキストのファイル記述子であることを認識できるようためです1
。2>&1
通常、私たちの中に、標準エラーに書き込まれたエラーメッセージキャプチャするために必要とされているmy.log
(標準出力から来ている)ファイルを。参照I / OリダイレクションシェルとI / Oリダイレクションの取り扱いの詳細については。
コマンドが定期的に出力を送信する場合は、で時々出力を確認tail my.log
できますtail -f my.log
。または、「ライブ」で追跡したい場合はを使用できます。最後に、プロセスを強制終了する必要がある場合は、次の方法で実行できます。
kill -9 `cat save_pid.txt`
rm save_pid.txt
nohup
PIDを出力するのは、それ自体ではなく、多少の明確化です。それは、PIDを表示する最終的な&
ものです。たとえばls &
、実行のPIDを表示しますls
2
は「標準エラー」ファイル記述子です。>
はシェルリダイレクトであり&1
、「標準出力」ファイル記述子です(&
これは、シェルが私がというファイルを参照しているとは思わないようにするために必要です1
)。したがって2 > &1
、標準エラー出力を標準入力にリダイレクトします。従来の> my.log
方法では標準出力をにリダイレクトmy.log
するため、エラーメッセージも確実にに送られるようにする方法が必要my.log
です。2 > &1
このようなエラーが標準出力に送られ、さらに標準出力に送られmy.log
ます。I / O Redirectionを参照してください。
echo $!
生成されたプロセスの代わりにnohupのpidを私に与えます:paste.fedoraproject.org/428697/99695314
&
はコマンドの区切り文字として機能するため、次のことを試すことができますsh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"
。うまくいくかもしれませんが、試したことはありません。
私はVPSサーバーで(そしてSSHを介して-puttyで)Red Hat Linuxを使用しています。
まず、実行中のすべてのプロセスをリストします。
ps -ef
次に、最初の列にユーザー名が表示されます。次の3回見つかりました。
次に、2列目にnohupプロセスのPIDが表示され、次のように入力するだけです。
kill PID
(もちろん、PIDをnohupプロセスのPIDに置き換えます)
これで完了です。
この回答が、私がbashとSSHに非常に慣れている人にも役立つことを願っていますが、ここで必要な知識の95%を見つけました:)
以下のコマンドでバックグラウンドでrubyスクリプトを実行しているとしましょう
nohup ruby script.rb &
次に、コマンド名を指定して、上記のバックグラウンドプロセスのPIDを取得できます。私の場合、コマンドはルビーです。
ps -ef | grep ruby
出力
ubuntu 25938 25742 0 05:16 pts/0 00:00:00 ruby test.rb
これで、killコマンドを使用してプロセスを簡単に強制終了できます
kill 25938
ps -ef
そしてkill
、両方のも上記覆われていたので、新しい部分は何ですか?
jobs -lを指定すると、nohupプロセスのリストのpidが表示されます。それらを穏やかに(-9)殺します。;)
kill -9
、通常の信号が機能しないことを知らない限り、そうしないでください。
あなたは試すことができます
kill -9 `pgrep [command name]`
pkill [command name]
あなたが-o
最も古いマッチングプロセスを殺すためにフラグ-n
を使用したり、代わりに最新のものを使用したりするために使用しました。
nohupを使用してJavaプログラムを実行しているとすると、次のようにしてJavaプロセスIDを取得できます。
`ps aux | grep java`
出力
xxxxx 9643 0.0 0.0 14232 968 pts/2
次に、次のように入力してプロセスを終了できます
sudo kill 9643
または、すべてのJavaプロセスを強制終了してから使用する必要があるとしましょう
sudo killall java
このコマンドは、すべてのJavaプロセッサーを強制終了します。これをプロセスで使用できます。コマンドの最後にプロセス名を指定するだけです
sudo killall {processName}
次のコマンドでdjangoサーバーを起動しました。
nohup manage.py runserver <localhost:port>
これはCentOSで動作します:
:~ ns$netstat -ntlp
:~ ns$kill -9 PID
process not found
nohupとの混乱を解決するための準備です。
今日、私は同じ問題に遭遇しました。そして、ずっと前だったので、どのコマンドをいつ使用したかを完全に忘れてしまいました。私は3つの方法を試しました:
ps -ef
コマンドに示されているSTIMEを使用します。これは、プロセスを開始する時間を示しています。sshを閉じる直前に、コマンドにnohupしている可能性が高いです(あなたに依存します)。残念ながら、最新のコマンドはnohupを使用して実行するコマンドではないと思うので、これは私には機能しません。ps -ef
コマンドでます。これは、親プロセスID、つまりプロセスを作成するプロセスのIDを意味します。nohupを使用して実行するプロセスのubuntuでは、ppidは1です。その後、使用できますps --ppid "1"
してリストを取得し、TIME(プロセスが使用する合計CPU時間)またはCMDを確認して、プロセスのPIDを見つけることができます。lsof -i:port
プロセスがいくつかのポートを占有している場合に使用すると、コマンドが表示されます。次に、上記の答えと同じように使用するps -ef | grep command
と、PIDが取得されます。プロセスのPIDが見つかったら、を使用kill pid
してプロセスを終了できます。
nohup
後でそれをで使用するkill
か、ps -ef
出力でコマンド名によってプロセスを検索し、そこからPIDを取得する必要があります。ではなく、コマンド名を探す必要がありますnohup
。