web-dev-qa-db-ja.com

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

Unixシステムで何年もkill <some_pid>だけを使用した後、Linuxに精通した若い人からpkillを学びました 同僚 同僚1

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

しかし、今はkillallしか見えません。ハウツーはkillallのみに言及しているようで、これが何らかの並行開発であるかどうか、またはkillallpkillの後継であるかどうか、または何か他のものではありません。

よりターゲットを絞ったpkillとして機能するようですが、何か不足していると確信しています。

Ubuntu/Debianに精通できますか2 killallをいつ(またはなぜ)使用する必要があるか、特にpkillより優先して使用する場合(pkillがより簡単に思える場合が多いため、名前の一致がずるずるしているため、少なくともデフォルトでは)。

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

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

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

90
belacqua

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

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

彼らのmanページから、killallは psmisc package から来ていることがわかります。これはいくつかのプロセス管理ユーティリティを持っていますが、特にpsを含んでいません。 procps package は、ps、top、kill、およびpkill(他のなかでも)を持っています。 procpsにはもともとpkillがなかったので、psmiscはかゆみをかき、killallを思いつきました。

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

その他のソース:

66
djeikyb

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

7
phessler

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

3
jet

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

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

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

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

2
Arcege