GNU/Linux >> Linux の 問題 >  >> Linux

LinuxでのKillallコマンドと例

Linuxコマンドラインには、プロセスを強制終了するためのさまざまなコマンドが用意されています。たとえば、「kill」コマンドを使用して、PIDを引数として渡すことでプロセスを強制終了できます。「pkill」コマンドはパターンを入力として受け取り、一致するすべての実行中のプロセスを強制終了します。ただし、コマンド'killall'が存在します。これは、デフォルトで引数名と完全に一致し、一致するプロセスを強制終了します。

この記事では、このコマンドについていくつかの実用的な例を挙げて説明します。 killallコマンドは、その名前を使用して特定のプロセスにシグナルを送信するために使用できます。これは、同じプログラムの5つのバージョンを実行している場合、killallコマンドは5つすべてを強制終了することを意味します。

シグナルは、このコマンドの引数として指定することも、 SIGTERMとして指定することもできます。 デフォルトで送信されます。プロセスは、親プロセスから独立した子プロセスを生成できます。これは、各サブプロセスがそのpidによって識別されていることを意味します。 killコマンドでは、pidを使用して強制終了するサブプロセスを選択しますが、killallコマンドでは、名前を指定して、すべてのサブプロセスとプロセスの親が同じ名前であるため、すべてのプロセスが強制終了されます。

>

いくつかの実用的な例を通して、killallコマンドの使用法について説明しましょう。

1)サポートされているすべての信号を一覧表示します

Killコマンドは、-lでリストできるいくつかのシグナルをサポートします オプション。 killallはシグナルをプロセスに送信します。 -sを使用できます 特定のシグナルをプロセスに送信するためのオプション(シグナル名が後に続く)。

$ killall -l
 HUP INT QUIT ILL TRAP ABRT IOT BUS FPE KILL USR1 SEGV USR2 PIPE ALRM TERM
 STKFLT CHLD CONT STOP TSTP TTIN TTOU URG XCPU XFSZ VTALRM PROF WINCH IO PWR SYS
 UNUSED

デフォルトでは、 SIGTERM / TERM(15) killallコマンドにシグナルが与えられていない場合は、プロセスに送信されます。上記のシグナルは、ユーザーとシステム管理者の両方が便利に使用できます。したがって、killallはこれらすべてのシグナルをサポートします。

2)特定のプロセスを強制終了します

プロセスを強制終了するには、プロセスを識別して、実行されているかどうかを確認する必要があります。その名前で特定のプロセスを強制終了できます。同じ初期文字を持つ2つのプロセスがあるとします:

$ ps -aef | grep "test"
 himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test
 himanshu 3970 2811 0 14:14 pts/0 00:00:00 ./test_again

ここで、killallコマンドを使用して'test_again'を強制終了する方法を説明します:

$ killall test_again
 [2]+ Terminated ./test_again

ご覧のとおり、killallコマンドは「test_again」プロセスを終了しました。これは、psコマンドでも確認できます:

$ ps -aef | grep "test"
 himanshu 3969 2811 0 14:14 pts/0 00:00:00 ./test

'test_again'は強制終了されるため、出力に表示されないことに注意してください。

3)ケースを無視してプロセスを強制終了します

killallコマンドは、デフォルトで大文字と小文字を区別します。次に例を示します:

$ ps -aef | grep "test"
 himanshu 4177 3161 0 14:54 pts/3 00:00:00 ./test
 himanshu 4178 3161 0 14:54 pts/3 00:00:00 ./test_again
 himanshu 4180 3161 0 14:54 pts/3 00:00:00 grep --color=auto test

すべてのプロセスが小文字であることがわかります。 「./test」プロセスを強制終了しようとしますが、名前は大文字で入力します

$ killall TEST
 TEST: no process found

したがって、'test'という名前のプロセスがすでに実行されているときに、killallコマンドがTESTという名前のプロセスを見つけることができなかったことがわかります。 killallコマンドが大文字と小文字を区別しないようにするには、-Iを使用します。 オプション。次に例を示します:

$ killall -I TEST
 [1]- Terminated ./test

これで、「テスト」プロセスが正常に終了したことを確認してください。

4)確認付きでプロセスを強制終了します

killallコマンドを使用して、プロセス以上のものを強制終了できます。

$ killall test test_again
 [2]- Terminated ./test_again
 [3]+ Terminated ./test

ただし、別の名前を指定してプロセス名を挿入すると、間違いが発生する可能性があります。示されたプロセスがシステムにとって重要なプロセスである場合、それは深刻な問題になる可能性があります。したがって、killallを使用して、確認を求めてプロセスをインタラクティブに終了することをお勧めします。これを行うには、-iを使用できます オプション。

$ killall -i test test_again
 Kill test(4201) ? (y/N) y
 Kill test_again(4202) ? (y/N) y
 [1]- Terminated ./test
 [2]+ Terminated ./test_again

したがって、この方法でユーザーがkillallコマンドを使用してプロセスの終了を制御できることがわかります。

5)プロセスを静かに強制終了します

killallが指定されたプロセスを見つけることができない場合、出力で同じことについて不平を言うことがあります。

次に例を示します:

$ killall TEST
 TEST: no process found

ただし、killallで静かに作業を実行したい場合は、-qを使用できます。 オプション:

$ killall -q TEST
$

したがって、-qを使用すると、出力が抑制されたことがわかります。

6)killallコマンドの奇妙な結果

killallコマンドのマニュアルページには、デフォルトでは、長さが15文字以下の場合にのみ完全な名前と一致すると記載されています。そのため、コマンド名が15文字より長い場合、フルネームが使用できない可能性があります(つまり、スワップアウトされます)。この場合、 killall 最初の15文字以内に一致するすべてのものを殺します。

たとえば、長い名前を持つ次の2つのプロセスがあるとします:

$ ps -aef | grep "test"
 himanshu 4021 3161 0 14:27 pts/3 00:00:00 ./test_abcdefghij
 himanshu 4035 3161 0 14:27 pts/3 00:00:00 ./test_abcdefgh

上記の出力の最初のプロセスの名前は正確に15文字です。 killallコマンドを使用してそれを殺してみましょう:

$ killall test_abcdefghij
 [1]- Terminated ./test_abcdefghij

したがって、killallコマンドがプロセスを正常に強制終了することがわかります。

さて、manページによると、両方の名前に15を超える一致する文字が含まれている場合、killallは、名前の後に-eが続くプロセスを強制終了します。 オプションまたはそれは最初の15文字以内に一致するすべてを殺します。次に例を示します:

$ ps -aef | grep "test"
 himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
 himanshu 4141 3161 0 14:46 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwxyz
 himanshu 4143 3161 0 14:46 pts/3 00:00:00 grep --color=auto test

両方のプロセスの名前に15を超える一致する文字が含まれていることを確認してください。さて、killallを使用して2番目のプロセスを強制終了しようとしたとき:

$ killall test_abcdefghijklmnopqrstuvwxyz
 [6]+ Terminated ./test_abcdefghijklmnopqrstuvwxyz

指定されたプロセスのみを強制終了し、2番目のプロセスも強制終了しませんでした

$ ps -aef | grep "test"
 himanshu 4114 3161 0 14:40 pts/3 00:00:00 ./test_abcdefghijklmnopqrstuvwx
 himanshu 4146 3161 0 14:47 pts/3 00:00:00 grep --color=auto test

私の側に何か間違っているのか、それともkillallコマンドのバグなのかわかりません。コメントでこれについての意見を述べていただければ幸いです。

ところで、私のシステムでのkillallコマンドの詳細は次のとおりです。

$ killall --version
killall (PSmisc) 22.20
Copyright (C) 1993-2012 Werner Almesberger and Craig Small

PSmisc comes with ABSOLUTELY NO WARRANTY.
This is free software, and you are welcome to redistribute it under
the terms of the GNU General Public License.
For more information about these matters, see the files named COPYING.

結論

Centos 7以降では、killallの代わりにpkillを実行することを推奨しているため、デフォルトでは、コマンドを実行すると「killall:command notfound」エラーが発生する可能性があります。それでも必要な場合は、psmiscパッケージ(#yum install)を追加してpkillをインストールしてください。 psmisc)。

Killallは、pidを思い出せなくても、その名前でプロセスを強制終了できるので便利です。比較的簡単に使用できるため、いくつかのオプションはありません。

関連項目:

  • Linuxターミナルからプロセスを強制終了する方法
  • fkill-Linuxでプロセスを強制終了するインタラクティブツール

Linux
  1. 例を含むLinuxTeeコマンド

  2. 例を含むLinuxヘッドコマンド

  3. Linux での killall コマンドの例

  1. 例を含むwcLinuxコマンド

  2. Linuxのソートコマンドと例

  3. LinuxでのJQコマンドと例

  1. Linuxでのエコーコマンド(例付き)

  2. Linuxでのmanコマンドと例

  3. LinuxでのAWKコマンドと例