PIDではなく名前でプロセスを強制終了するにはどうすればよいですか?


349

Firefoxを起動しようとすると、「Firefoxプロセスがすでに実行中」と表示されることがあります。だから私はこれをしなければなりません:

jeremy@jeremy-desktop:~$ ps aux | grep firefox
jeremy    7451 25.0 27.4 170536 65680 ?        Sl   22:39   1:18 /usr/lib/firefox-3.0.1/firefox
jeremy    7578  0.0  0.3   3004   768 pts/0    S+   22:44   0:00 grep firefox
jeremy@jeremy-desktop:~$ kill 7451

私が望んでいるのは、それをすべて私のために行うコマンドです。それは入力文字列を受け取りgrep、プロセスのリストにその文字列(または何でも)を取り、出力のすべてのプロセスを強制終了します。

jeremy@jeremy-desktop:~$ killbyname firefox

私はそれをPHPで試してみましたが、PHPスクリプト自体でexec('ps aux')実行されたプロセスのみを表示しているexec()ようです(したがって、表示されるプロセスはそれ自体です)。


Firefoxがすでに実行されているというウィンドウが表示されたら、通常は1秒待つだけで、Firefoxを再度実行できます(もちろん、常にそうであるとは限りません)。
nuoritoveri 2014

1
:JohnBはこの回答で述べているように、これは最も安全な方法です stackoverflow.com/questions/6381229/...
tecnoshopbq


これは古い質問ですが、受け入れられた回答を変更していただけませんか。マークしたプロセスは、JVMで実行されるプロセスなど、多くのプロセスで失敗します。
ルイス・デ・スーザ

このトピックを参照している人のために、上記のコメントで、Luisはpkill -f "Process name"コマンドを宣伝する以下の回答を参照しています...
Digger

回答:


505

7
殺害プロセスを回避する前に、pgrepを使用して何を殺しているのかを把握することは良いことです。特にを使用する場合-f
Akrikos 2013年

pkillはとてもフレンドリーではありません。killallが受け取るのと同じ方法で名前を付けることはできません。
タコ

2
pkill -U <username>かなり便利です。私は、実際のWebサーバーデーモンであるSolaris Webサーバーを、独自のユーザーでサービスとして設定しています。したがって、ユーザーによる指定は、再起動をトリガーする簡単な方法です。
レイストーム2015

6
強制的に殺すには:pkill -9 firefox
Justas '30 / 07/30

これは最大で半分の時間で動作します。-fオムニバスソリューションには少なくともフラグが必要です。
ルイス・デ・スーザ

112

使用することも可能:

pkill -f "Process name"

私にとって、それは完璧に機能しました。それは私が探していたものでした。pkillは、フラグのない名前では機能しません。

場合に-f設定されている、完全なコマンドラインは、パターンマッチングのために使用されます。


2
特にワインで何かを実行するために-fは、オプションが本当に必要です。例pkill -f "EvilWindowsServer.exe"
CodeBrauer、2015年

これは受け入れられる答えになるはずです。最初の答えは、JVMで実行されているプログラムなど、多くの種類のプログラムで失敗します。
ルイス・デ・スーザ

1
-fPythonスクリプトを実行しているバックグラウンドプロセスを強制終了するためにも、フラグを追加する必要がありました。
メイソン

私の場合、私は2つのフラグが必要でした:pkill -f -9 PROCESSNAME
スラビック

centos7.thankでの作業
sirmagid

64

あなたは名前でプロセスを殺すことができますkillall <name>

killallは、指定されたコマンドのいずれかを実行しているすべてのプロセスにシグナルを送信します。シグナル名が指定されていない場合、SIGTERMが送信されます。

シグナルは、名前(例:-HUPまたは-SIGHUP)または番号(例: -1)またはオプション-sのいずれかで指定できます。

コマンド名が正規表現ではなく(オプション-r)、スラッシュ(/)が含まれている場合、その特定のファイルを実行しているプロセスは、その名前に関係なく、強制終了のために選択されます。

しかし、でプロセスが表示ps auxされない場合、おそらくそれを強制終了する権利はありません...


6
応答しないプログラムを終了強制するには、代わりにTERMのKILLを送る:killall -s KILL firefox
マーティン・ハンセン

45

もう少し長い代替:

kill `pidof firefox`

25
pidof firefox | xargs kill -9
hbt

1
これは、組み込みデバイスのbusyboxの下で動作します:)
nwgat

25

最も簡単な方法は、最初に正しいプロセスIDを取得していることを確認することです。

pgrep -f [part_of_a_command]

結果が期待どおりである場合。と一緒に行きます:

pkill -f [part_of_a_command]

19

奇妙ですが、私はこのような解決策を見ていません:

kill -9 `pidof firefox`

次のような複数のプロセス(複数のPID)を強制終了することもできます。

kill -9 `pgrep firefox`

pidof単一行の出力があるので、私は好む:

> pgrep firefox
6316
6565
> pidof firefox
6565 6316

これを実行すると、エラーが発生しましたkill: invalid number 'pidof myprogram'。ここで何が悪いのですか?
Brethlosze 2017

これで私の今日の命が救われました...これ以上書きたくありませんが、ここで見つけてよかったです。ありがとう。
MilMike

1
遅くなりますが、誰か他の人が不思議に思った場合に備えて... @Brethloszeは単一のティックを入れますが、コマンドにはバックティックが必要です。
2018

ありがとう!..私はこれらのバッククォートに気づきます(そして私は

13

snippet起動パスにあるすべてのプロセスを強制終了します。/ directory /をスニペットとして配置することで、いくつかのディレクトリから起動したすべてのアプリを強制終了できます。これは、同じアプリケーションディレクトリから同じアプリケーションの複数のコンポーネントを起動するときに非常に便利です。

ps ax | grep <snippet> | grep -v grep | awk '{print $1}' | xargs kill

*可能であればpgrepを優先します


1
これは、よく見られるアンチパターンの組み合わせです。自分自身(または含まれているスクリプトの名前)と一致しない正規表現を使用し、役に立たないgrepを避けます。ps ax | awk '/[s]nippet/ { print $1 }' | xargs kill
tripleee 2018年

1
無駄なgrepを避けながら、タイプミスや、<snippet>をパラメーター化する自動プロセスでコマンドを使用する機能を避けていません
Mike

これは確かにそれを行うための最良の方法です!
Abhinandan Dubey

@tripleee [s]がawkプロセス自体と一致しないという点で機能する理由を理解するのは素晴らしいことでしょうか?
andig

正規表現[x]yは文字列と一致しますxyが、その逆は一致しないためです。これは一般的なFAQです。リンクは、20年以上前のページへのリンクで、これについて詳しく説明しています。そして、これはすでに繰り返しの質問でした。
tripleee

11

Macではpgrepもpkillも見つからなかったため、killallが機能していなかったため、簡単な1行のスクリプトを記述しました。

export pid=`ps | grep process_name | awk 'NR==1{print $1}' | cut -d' ' -f1`;kill $pid

これを行う簡単な方法がある場合は、共有してください。


1
笑。これは、そのようなタスクに対する非常識なコマンドです。気にしないで。その単純な1行と呼びましたか?:D Simple is killall
m3nda

@ erm3nda :-)そうですね。振り返ってみると、正気に見えません。killallが私のMacで機能しなかった理由を思い出せません。
Dhiraj 14

これは、「jboss」などの特定のJavaプロセスを強制終了する場合に非常に役立ちます。その場合、killallは役に立ちません。
Jan M


6

grepで殺すには:

kill -9 `pgrep myprocess`

5

より正しいでしょう:

export pid=`ps aux | grep process_name | awk 'NR==1{print $2}' | cut -d' ' -f1`;kill -9 $pid

1
export同じプロセスで一度しか使用しない変数を使用するのはなぜですか?
tripleee 2018年


3

私は自分自身に同じ質問をしてましたが、現在の答えと問題はそうではないということであるプロセスが殺されることは安全チェックをそれはひどいミスにつながる可能性がある...そう:)...場合は特に、いくつかのプロセスがパターンに一致します

免責事項として、私はshプロではありません。確かに改善の余地があります。

だから私は小さなshスクリプトを書きました:

#!/bin/sh

killables=$(ps aux | grep $1 | grep -v mykill | grep -v grep)
if [ ! "${killables}" = "" ]
then
  echo "You are going to kill some process:"
  echo "${killables}"
else
  echo "No process with the pattern $1 found."
  return
fi
echo -n "Is it ok?(Y/N)"
read input
if [ "$input" = "Y" ]
then
  for pid in $(echo "${killables}" | awk '{print $2}')
  do
    echo killing $pid "..."
    kill $pid 
    echo $pid killed
  done
fi

2

GNOMEを実行している場合は、Windowsの場合と同様に、システムモニター([システム]-> [管理]-> [システムモニター])を使用してプロセスを強制終了できます。KDEも似たようなものになります。


2

デフォルトのkillコマンドは、PIDの代わりにコマンド名を受け入れます。kill(1)を参照してください。よく発生する問題は、コマンド名ではなく、などのジョブ番号を受け入れるbash独自の問題を提供することです。これはデフォルトのコマンドを妨害します。前者の機能が後者よりも便利な場合は、次のコマンドを呼び出してバージョンを無効にすることができますkillkill %1bash

enable -n kill

より多くの情報を参照してくださいkillenableのエントリはbash(1)


どのようにしてアクションを再度有効にしますenable -n killか?
Brethlosze 2017

1
@hyprfrcbenable kill
Vee



0

awk oneliner。ps出力のヘッダーを解析するため、列番号(ただし列名)を気にする必要はありません。正規表現をサポートします。たとえば、実行可能ファイルの名前(パスなし)に「firefox」という単語が含まれているすべてのプロセスを強制終了するには

ps -fe | awk 'NR==1{for (i=1; i<=NF; i++) {if ($i=="COMMAND") Ncmd=i; else if ($i=="PID") Npid=i} if (!Ncmd || !Npid) {print "wrong or no header" > "/dev/stderr"; exit} }$Ncmd~"/"name"$"{print "killing "$Ncmd" with PID " $Npid; system("kill "$Npid)}' name=.*firefox.*
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.