プロセスIDを取得してnohupプロセスを強制終了する方法は?


204

サーバーでnohupプロセスを実行しています。それを殺そうとすると、代わりにパテコンソールが閉じます。

これが私がプロセスIDを見つけようとする方法です。

ps -ef |grep nohup 

これは殺すためのコマンドです

 kill -9 1787 787

6
スクリプトまたはコマンドラインからそれを強制終了しようとしていますか?を実行するときにPIDを保存し、nohup後でそれをで使用するkillか、ps -ef出力でコマンド名によってプロセスを検索し、そこからPIDを取得する必要があります。ではなく、コマンド名を探す必要がありますnohup
ラーカー、2013年

1
@mbratchコメントではなく、回答する必要があります。
Ansgar Wiechers 2013年

@AnsgarWiechers提案をありがとう。私の応答が非常に短い場合や、OPが求めていることを完全にカバーしていると確信できない場合は、回答として投稿するのをためらいます。回答を追加し、より多くの情報を含めました。
潜水艦2013年

回答:


353

使用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、シェルがそれをその名前のファイルだけでなく、そのコンテキストのファイル記述子であることを認識できるようためです12>&1通常、私たちの中に、標準エラーに書き込まれたエラーメッセージキャプチャするために必要とされているmy.log(標準出力から来ている)ファイルを。参照I / OリダイレクションシェルとI / Oリダイレクションの取り扱いの詳細については。

コマンドが定期的に出力を送信する場合は、で時々出力を確認tail my.logできますtail -f my.log。または、「ライブ」で追跡したい場合はを使用できます。最後に、プロセスを強制終了する必要がある場合は、次の方法で実行できます。

kill -9 `cat save_pid.txt`
rm save_pid.txt

15
nohupPIDを出力するのは、それ自体ではなく、多少の明確化です。それは、PIDを表示する最終的な&ものです。たとえばls &、実行のPIDを表示しますls
karmakaze

1
「2>&1」は何をしますか?
Viraj

4
@Viraj 2は「標準エラー」ファイル記述子です。>はシェルリダイレクトであり&1、「標準出力」ファイル記述子です(&これは、シェルが私がというファイルを参照しているとは思わないようにするために必要です1)。したがって2 > &1、標準エラー出力を標準入力にリダイレクトします。従来の> my.log方法では標準出力をにリダイレクトmy.logするため、エラーメッセージも確実にに送られるようにする方法が必要my.logです。2 > &1このようなエラーが標準出力に送られ、さらに標準出力に送られmy.logます。I / O Redirectionを参照してください。
ラーカー、

6
echo $!生成されたプロセスの代わりにnohupのpidを私に与えます:paste.fedoraproject.org/428697/99695314
Nehal J Wani

1
@Mvorisek &はコマンドの区切り文字として機能するため、次のことを試すことができますsh -c "nohup my_command > my.log 2>&1 & echo $! > save_pid.txt"。うまくいくかもしれませんが、試したことはありません。
ラーカー、

91

私はVPSサーバーで(そしてSSHを介して-puttyで)Red Hat Linuxを使用しています。

まず、実行中のすべてのプロセスをリストします。

ps -ef

次に、最初の列にユーザー名が表示されます。次の3回見つかりました。

  • 1つはSSH接続でした
  • 2番目はFTP接続でした
  • 最後はノーフプロセスでした

次に、2列目にnohupプロセスのPIDが表示され、次のように入力するだけです。

kill PID 

(もちろん、PIDをnohupプロセスのPIDに置き換えます)

これで完了です。

この回答が、私がbashとSSHに非常に慣れている人にも役立つことを願っていますが、ここで必要な知識の95%を見つけました:)


3
ここではUIDではなくPIDを意味していると思いますか?
wprins

@wprinsに同意します。UIDを殺してもうまくいきませんでしたが、PIDを殺すとうまくいきました。
ライアン

私の場合、私はnohupと&とテストシェルスクリプト(long_running_script.sh)を実行し、それを停止する方法を知っています。最後に、ps -ef | grep long_running *およびPIDを見つけます。その後、殺害PIDを行いました
Rennish Joseph

50

以下のコマンドでバックグラウンドで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

1
サンジャイ、私は何も見逃していないと確信しているので、あなたの回答のどの部分が新しく、何年も前に提供された回答と異なっていますか?ps -efそしてkill、両方のも上記覆われていたので、新しい部分は何ですか?
David

2
ps -efを実行すると、出力の長いリストが表示され、この長いリストからの検索は困難になります。だから私はps-efを考える| grep ruby​​は、単にps -efを実行するよりもpidを検索するためのより良いコマンドです
Sanjay Salunkhe

20

jobs -lを指定すると、nohupプロセスのリストのpidが表示されます。それらを穏やかに(-9)殺します。;)


11
ジョブが現在のシェルで開始された場合のみ。そしてkill -9、通常の信号が機能しないことを知らない限り、そうしないでください。
tripleee 2016

1
これは、psがインストールされていない
Docker

5

あなたは試すことができます

kill -9 `pgrep [command name]`

2
非常に素晴らしい!私はpkill [command name]あなたが-o最も古いマッチングプロセスを殺すためにフラグ-nを使用したり、代わりに最新のものを使用したりするために使用しました。
zanona 2017年

4

これは Ubuntu

これを入力して、 PID

ps aux | grep java

Javaに関して実行中のすべてのプロセスが表示されます

私の場合は

johnjoe      3315  9.1  4.0 1465240 335728 ?      Sl   09:42   3:19 java -jar batch.jar

今それを殺します kill -9 3315

ゾンビプロセスがようやく停止しました。


4

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}

2

nohupでジョブを作成すると、プロセスIDが表示されます。

nohup sh test.sh &

出力には、次のようなプロセスIDが表示されます

25013

あなたはそれを殺すことができます:

kill 25013

1

次のコマンドでdjangoサーバーを起動しました。

nohup manage.py runserver <localhost:port>

これはCentOSで動作します:

:~ ns$netstat -ntlp
:~ ns$kill -9 PID 

これがprocess not foundnohupとの混乱を解決するための準備です。
CodeSpent 2018

0

今日、私は同じ問題に遭遇しました。そして、ずっと前だったので、どのコマンドをいつ使用したかを完全に忘れてしまいました。私は3つの方法を試しました:

  1. ps -efコマンドに示されているSTIMEを使用します。これは、プロセスを開始する時間を示しています。sshを閉じる直前に、コマンドにnohupしている可能性が高いです(あなたに依存します)。残念ながら、最新のコマンドはnohupを使用して実行するコマンドではないと思うので、これは私には機能しません。
  2. 2つ目はPPIDで、これも ps -efコマンドでます。これは、親プロセスID、つまりプロセスを作成するプロセスのIDを意味します。nohupを使用して実行するプロセスのubuntuでは、ppidは1です。その後、使用できますps --ppid "1"してリストを取得し、TIME(プロセスが使用する合計CPU時間)またはCMDを確認して、プロセスのPIDを見つけることができます。
  3. lsof -i:portプロセスがいくつかのポートを占有している場合に使用すると、コマンドが表示されます。次に、上記の答えと同じように使用するps -ef | grep commandと、PIDが取得されます。

プロセスのPIDが見つかったら、を使用kill pidしてプロセスを終了できます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.