バックグラウンドプロセスを終了する方法


196

を使用してバックグラウンドでリモートマシンでwgetを開始しました&。突然ダウンロードが停止します。プロセスを終了してから、コマンドを再実行します。どうすれば終了できますか?

シェルウィンドウを閉じていません。ただし、ご存じのとおり、Ctrl+ CCtrl+の使用は停止しませんZ

回答:


256

これには多くの方法があります。

方法#1-ps

psコマンドを使用してこのプロセスのプロセスIDを検索し、PIDを使用してプロセスを強制終了できます。

$ ps -eaf | grep [w]get 
saml      1713  1709  0 Dec10 pts/0    00:00:00 wget ...

$ kill 1713

方法#2-pgrep

を使用してプロセスIDを見つけることもできますpgrep

$ pgrep wget
1234

$ kill 1234

方法#3-pkill

実行したのがそれだけだと確信している場合wgetは、コマンドpkillを使用して名前でジョブを強制終了できます。

$ pkill wget

方法#4-ジョブ

現在バックグラウンドになっているジョブを実行した場所と同じシェルにいる場合。jobsコマンドを使用して、まだ実行されているかどうかを確認したり、ジョブ番号で強制終了したりできます。

私の偽の仕事sleep

$ sleep 100 &
[1] 4542

ジョブ番号を見つけます。注:番号4542はプロセスIDです。

$ jobs
[1]+  Running                 sleep 100 &

$ kill %1
[1]+  Terminated              sleep 100

方法#5-fg

fgコマンドを使用して、バックグラウンドジョブをフォアグラウンドに戻すことができます。

偽の仕事sleep

$ sleep 100 &
[1] 4650

ジョブの番号を取得します。

$ jobs
[1]+  Running                 sleep 100 &

ジョブ#1をフォアグラウンドに戻し、Ctrl+ を使用しますC

$ fg 1
sleep 100
^C
$

jobsはno outputfg sais:があり-bash: fg: 1: no such jobます。しかし、タイピングがfgうまく機能してもpkill wgetうまく動作します。しかしps -eaf|grep wget、それからkill <process number>仕事を止めないでください。ps:3番目の番号をプロセス番号として使用します
モハマドエテマダール

1
@MohammadEtemaddar-の出力から2番目の数値を使用しpsます。3番目の#は、親のプロセスIDです。
slm

1
@MohammadEtemaddar-ああ、psはgrepを見つけています。次のようにしますps -eaef| grep [w]get
slm

1
@MohammadEtemaddar- pgrep代わりにを使用することもできますpgrep wget
slm

2
@MohammadEtemaddar-すみません、余分なeはタイプミスです。読む必要がありますps -eaf | grep [w]get。オプションはpsmanページにあります。man ps
slm

70

bashではfg、ジョブをフォアグラウンドに移動してからCtrl+ を使用できますC

または、バックグラウンドでプロセスをリストjobsしてから

kill %1

(1を数字に置き換えてjobs


13

同様にkill $!、最新のバックグラウンドジョブを強制終了することもできます。


bashプロファイルのエイリアスのようなコマンドとして使用する場合は、必ず単一引用符で囲んでください。
ネイトリッター

6

編集:フォアグラウンドになったら、Ctrl+ C、または@Zeldaが言及しているように、「%x」で殺すことができます。「x」はジョブ番号であり、デフォルトのシグナル(Linuxの場合はSIGTERMが最も可能性が高い)を送信します。

ちょうど入力しfg、それはあなたが(「&」で)バックグラウンドに最後のプロセスだった場合、フォアグラウンドにそれを持参します。

最後のものではない場合はjobs、「:」と入力して、「[]」で表される「ジョブ番号」を見つけます。次に入力するだけです:

fg 2

..ここで、「2」はジョブ番号です。例:

foo@bar:~/junk/books$ jobs
[1]+  Running                 okular how_to_cook_a_turkey.pdf &
foo@bar:~/junk/books$ fg 1
okular how_to_cook_a_turkey.pdf            <- this is now in the foreground.

4

正しい方法は、入力jobsしてからジョブ番号を使用して強制終了することです。pidを使用してそれを殺すには、最初の回答で述べたように、それをフォアグラウンドに持ってくる必要があります。

これを試して

~/Desktop$ sleep 1000 &
[1] 7056

~/Desktop$ jobs

[1]+  Running  sleep 1000 &

/Desktop$ kill %1  #(%1 is the job number)

強制終了した直後にジョブを実行すると、これが表示されます。

Desktop$ jobs
[1]+  Terminated              sleep 1000

4

ここに表示されていないことの1つは、特にコマンドをテストするときに非常に便利だとわかったことですpidofpidof [command]現在実行中のプロセスのプロセスIDを見つけるために使用できます。欲しいコマンドのIDをすばやく見つけることができるので、それが気に入っています。これは通常、私がちょうど呼び出したものです。

pidを取得したら、プロセスを強制終了できます。現在実行中のプロセスのみを強制終了するための簡単なスクリプトを作成できます。


1
ああ、これは私を助けてくれました!キル%1は何らかの理由で機能していませんでした。「kill:引数の解析に失敗しました: '%1'」およびCtrl + Cが機能していませんでした。ルートであるため、psなどでプロセスを見つけることができませんでした(sudoを使用したのを忘れていました)
-mjohnsonengr

1

一般的な例はstressツールです。次を実行したとしましょう:

$ stress -c 4 -m 4 

ターミナルウィンドウを閉じました。プロセスは、バックグラウンドからリソースを使い続けます。

彼女のやることは:

$ x=`pgrep stress` ; sudo kill -9 $x 

pgrep対象のプロセスのPIDをリストし、それを変数に保存し、それをx使用しkill -9てプロセスを終了します。


0

bashで最後に停止したプロセス(Ctrl-Z)では、次の方法で強制終了します。

kill %%
kill -9 %%

または選択する場合は、次を使用します。

jobs

その後:

kill %N

好む kill %2

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