「killall」と「pkill」の違いは何ですか?


92

単なる使用した後はkill <some_pid>、長年にわたりUnixシステム上で、私が学んだpkill若いのLinuxに精通したから同僚の同僚1

私はすぐにLinux方式を受け入れました。多くの昼夜を問わず、スローダウンと競合状態を経てpgrep-ingとpkill-ingしました。これはすべて順調でした。

でも今は何も見えませんkillall。ハウツーはにしか言及しkillallていないようですが、これが何らかの並行開発なのか、それともkillall後継者pkillなのか、それとも何か他のものなのかはわかりません。

よりターゲットを絞った機能として機能しているように見えますが、pkill何かが欠けていると確信しています。

Ubuntuの/ Debianの-精通することができます2人はとき(あるいは、なぜ)を説明しkillall、それがに優先して使用する必要がある場合は特に、使用すべきであるpkill(ときpkill私は、少なくともデフォルトでは、名前の一致でsloppierことができるため、多くの場合、簡単に思えます)。

と言えば、killall一部のUnixシステム(Solaris、AIX 、?)ですべてのユーザープロセスを強制終了するコマンドについては考えていません。ここではそのバージョンの記述から、だIBMのAIXのマンページ

killallコマンドは、killallプロセスを生成するプロセスを除き、開始したすべてのプロセスをキャンセルします。このコマンドは、制御するシェルによって作成されたすべてのプロセスをキャンセルする便利な手段を提供します。rootユーザーによって開始されると、killallコマンドは、それを開始したプロセスを除くキャンセル可能なプロセスをすべて取り消します。複数のシグナルが指定されている場合、最後のシグナルのみが有効です。

1「同僚」は「同僚」からの無料アップグレードなので、同様に可能性があります。
2もともとこれはLinuxまたはDebianのものだと思っていましたが、一部の情報源は、Linux killallはBSD風味のUnixに由来すると言っています。

回答:


68

デフォルトでは正確なプロセス名が必要ですが、pkillは基本的なパターンマッチングを行うため、ハウツーでkillallが表示されると思います。したがって、killallはユーザーが盲目的にコピーアンドペーストする方が安全です。

Pkillとkillallには両方とも際立ったオプションがあります。Killallにはプロセスの経過時間で一致するフラグがあり、pkillには特定のttyのプロセスのみを強制終了するフラグがあります。Etcetera ad nauseum。どちらも優れていない、彼らはちょうど異なる専門を持っています。

彼らのmanページから、killallはpsmiscパッケージから来ていることがわかります。psmiscパッケージにはいくつかのプロセス管理ユーティリティがありますが、特に含まれていませんps。それはだprocpsのパッケージ PS、トップ、殺す、と(特に)pkillコマンドを持っています。procpsには元々pkillがなかったので、psmiscはかゆみをかき、killallを思いつきました。

pkillは/ pgrepコマンドのmanページは、あなたが言及したよう彼らは、Solaris 7で導入されたと言い、jgbelacquaは、Solarisののkillallをではなく、ユーティリティpsmiscのは、このようにSolarisは、おそらく唯一のprocpsのパッケージを持っていた、提供しました。誰かがパターンマッチングプロセスツール、つまりpkillとpgrepを望んでいました。それがprocps開発者によって開発されたのか、後で追加されたのかはわかりません。とにかく、それは入って、どこでも* nixesの一部になりました。

その他のソース:


1
うーん- killall(古い?)Solarisシステムがありましたが、動作が異なりました。それはすべてを殺した。
belacqua

6
@manish-えー、SysVシステムには異なるkillallがありました。
belacqua

1
@djeikyb killallがより安全であるという考えは正しいように聞こえます。
ベラク

5
@Manish:pkill(killなし)には、pid番号もプロセス名も必要ありません。プロセス名のパターン一致を行います。
ハビエルリベラ

3
killall is safer for users to blindly copy and pasteただし、killallが実際にすべてを強制終了するマシンを使用している場合を除きます。2つの異なるユーティリティの名前が同じになるのは残念です。
ライライアン

7

「killall」に注意してください。一部のシステムでは(どちらを忘れるか)、killallはすべてのプロセスを強制終了ます。引数を静かに無視し、システムを完全に停止します。


5
本当じゃない。引数なしのkillallは何もしません。killallは引数を無視しません。 kill -9 -1あなたのシステムを殺すkillall -9 -1かもしれないし、そうするかもしれない。それだけではないkillall [program]
トーマス・ウォード

6
元の質問で述べたように、これはSysVシステムにも当てはまります。
アランク

3

/ etc / bash_completionをアクティブにしてからkillall <part_of_process_name>タブを押すと、実行中のプロセスのリストからプロセス名が自動補完されます


2
同じ自動補完がpgrep / pkillで実行されます。私がよくやるのはpkill plug<tab>、しばらく使用したいものはないが、Firefoxを積極的に使用したいことがわかっているときに、FirefoxのFlashプラグインを強制終了することです。これはシェルの機能であり、killallとpgrep / pkillの違いではありません。
アルセージュ

1
私は違いとは言いませんでし
jet

2

両方のプログラムのオプションを見ると、両方とも同じことをしているが、方法が異なることがわかります。

pkillは、プロセスのさまざまな属性(CMD、PID、PPID、UID ...)でマッチングを実行し、一致する各プロセスに特定のシグナルを送信します。(CMDの場合は正規表現が使用され、その他の場合は文字列です)。pkillは対話型ではありませんが、バッチプログラムには適しています。

killallは、コマンド文字列全体ではなく、プロセス名(comm)またはユーザー(user)でマッチングを実行します。引数は単純な文字列として使用され、 'comm'値全体と一致する必要があります(これを変更する--regexpオプションもあります)。killallには--interactiveおよび--younger-thanオプションがあり、pkillにはありません。

SysV時代のkillall5もあり、他のUNIXバリアントに移植されました(Ubuntuパッケージ「sysutils」の下にあると思われます)。これは、昔ながらの方法では異なる動作をします。これは、シャットダウンまたはシングルユーザーモードへの変更を行うために、initスクリプトの内部でよく使用されていました。


2
いいえ、どちらpkillkillall対話形式でのみ、スクリプトで使用しない、と慎重にする必要があります。
ガイラ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.