Linux プロセスを強制終了する方法。 Linux でのプロセスの強制終了 - ps、kill、killall コマンド Linux でプロセスを停止する方法

02.09.2023

Linuxでプロセスを強制終了する方法を紹介します。 Linux の主な利点の 1 つは、サーバーを再起動せずにプロセスを終了できることです。 この記事では、Linux でプロセスを強制終了する方法を説明します。 強制終了コマンド、pkillとkillall。

1.PIDとは

始める前に、プロセス ID (PID) とは何かを知っておく必要があります。

PID は、 のプロセスのデジタル ID を表します。 各プロセスには一意の PID があります。 実際、たとえば、Linux ベースのシステムで開始される最初のプロセスはプロセスであり、その PID は 1 に設定されます。このプロセスは他のすべてのプロセスの親です。 init プロセスは kill コマンドを使用して強制終了することはできないため、誤って強制終了されることがなくなります。

ここで、サーバー上で実行中の各プロセスの PID を見つけるために、次のコマンドを実行できます。

これにより、実行中のすべてのプロセスとそれに対応する PID のリストが得られます。

特定のプロセスの PID を見つけたい場合は、pidof コマンドに続いてプロセス名を使用します。 たとえば、MySQL プロセスの PID を確認するには、次のコマンドを実行できます。

Pidof mysql

さらに詳細な情報については、次のコマンドを使用できます。 ps 補助とともに grep:

PS補助 | grep mysql

PID とは何か、そして特定のプロセスの PID を見つける方法がわかったので、次のセクションに進み、プロセスを強制終了する方法を学びます。

2. Linux で kill コマンドを使用してプロセスを強制終了します。

kill コマンドの使用を開始する前に、知っておく必要がある重要なルールがいくつかあります。

  • 自分のユーザー ID に属するネイティブ プロセスのみを強制終了できます
  • 他のユーザーのプロセスを強制終了することはできません
  • システムプロセスを強制終了することはできません(スーパーユーザーでない限り)
  • root ユーザーは、他のユーザーのプロセスおよびシステム プロセスを強制終了できます。

kill コマンドでプロセスを強制終了すると、実際には強制終了したい特定の PID 信号が送信されます。 kill コマンドでは次のシグナルが使用されます。

1 = 電話を切る 9 = キル 15 = 終了

ハングアップ信号はほとんど使用されません。 ほとんどの場合、kill シグナルを使用しますが、それが機能しない場合は、Terminate シグナルを使用できます。

したがって、強制終了したいプロセスの PID が見つかったら、前に説明した方法のいずれかを使用して、次のコマンドを使用できます。 kill -9 PIDその特定の PID からプロセスを強制終了します。

たとえば、PID が 6738 の場合、次のコマンドを使用できます。

キル -9 6738

3. Linux で pkill コマンドを使用してプロセスを強制終了する

PID の代わりにプロセス名を使用してプロセスを強制終了したい場合は、pkill コマンドを使用できます。 たとえば、強制終了したいプロセスが と呼ばれる場合、次のコマンドを使用してそれを強制終了できます。

Pkill mysql

4. Linux で killall コマンドを使用してプロセスを強制終了する

以前のコマンド特定のプロセスを 1 つだけ強制終了するために使用されます。 ただし、プロセスとそのすべての子プロセスを強制終了したい場合は、次のコマンドを使用できます。 キオール:

mysqlを殺す

この例では、MySQL プロセスとそのすべての子プロセスを強制終了します。

これらは、Linux におけるプロセス強制終了の最も一般的な例です。

想像してみてください。プログラムを起動して作業すると、しばらくすると応答が停止してフリーズします。 アプリケーションのインスタンスがまだコンピューターのメモリ内にハングしているため、アプリケーションを再起動することはできません。 この場合はどうすればよいでしょうか? まず、プログラムを終了し、メモリからプロセスを削除する必要があります。

最もシンプルで、 普遍的な方法 Linux でプロセスを強制終了するには、ターミナル コマンドを使用します。 このオプションはどのような環境でも機能します Linuxディストリビューション.

Linux のプロセス

手術室で Linuxシステムプロセスは通常呼ばれます 実行中のプログラムまたはアプリケーション。 プロセスは、現在実行されている任意のタスクと呼ぶこともできます。 Linux制御。 実行中のプロセスはどれも子プロセスを起動できます。

Linux 上で実行されるすべてのプロセスには次の属性があります。

  1. PID は各プロセスの一意の識別子です。
  2. PPID - 親プロセスの識別子。
  3. プロセスを開始したユーザーの ID。
  4. 優先度。
  5. プロセスの状態。

実行中の各プロセスは、次のいずれかの状態になります。

  • "進行中。" 文字 R はこの状態を表すために使用されます。
  • 入力や出力などのシステムの動作を開始し、その完了を待つプロセスを「待機中」といいます。 文字 S で示されます。
  • ユーザーまたは Linux OS によって停止されたプロセスは、停止状態になります。 この状態を記号 T で示します。
  • 「ゾンビ」とは、実行されていないものの、リソースを消費しているプロセスです。 オペレーティング·システム。 それらは文字 Z で指定されます。
  • 連続プロセスは、DMA 操作が完了するまで終了できません。 このプロセスは記号 D で示されます。

プロセス検索

Linux でプロセスを強制終了する前に、まずそのプロセスを見つける必要があります。 Linux でこの目的で最もよく使用される 2 つのコマンドは、top と ps です。

一番上のコマンドが表示されます 完全なリスト現在のプロセス。 さらに、リストには各項目に関する多くの役立つ情報が含まれています。 実行中のプロセス、 例えば:

  • PID - 固有のプロセス番号。
  • USER - このプロセスを起動したユーザーのログイン。
  • PR - 特定の時点でのプロセスの優先度。
  • NI - NICE コマンドによってプロセスに割り当てられた優先度。
  • S はこのプロセスの状態です。
  • %CPU - このプロセスにかかる CPU 時間 (パーセント)。
  • %MEM ボリューム ラム、このプロセスにかかる時間(パーセント)。
  • TIME+ - プロセスが開始されてから経過した時間。
  • COMMAND は、プロセスを開始したプログラムです。

top コマンドによって提供される情報は、使用された CPU 時間のレベル (%CPU 列) によってソートされて表示されます。 ユーザーは並べ替え順序を変更できます。

  • 占有 RAM の量 (%MEM 列) でプロセスを並べ替えるには、Shift+M キーの組み合わせを押す必要があります。
  • Shift+N の組み合わせを使用して、プロセス番号 (PID 列) で並べ替えることができます。
  • 稼働時間順に並べ替えます (TIME+ 列) - Shift+T。
  • CPU 負荷レベルによる元の並べ替えに戻ります - Shift+P を押します。

psコマンドを使用する

top コマンドは多くの有用な情報を提供しますが、最も重要な情報ではありません。 便利な方法必要なプロセスに関する必要な情報を取得します。 必要なプロセスを検索しないようにするには、ps コマンドを使用し、greep コマンドを使用してリストをフィルタリングします。 たとえば、実行中のプロセスに関連付けられたすべてのプロセスを検索したい場合、 Opera ブラウザ、コマンド ps axu | を入力できます。 Mozilla を grep します。

ps コマンドには次のオプションがあります。

  • a - すべてのユーザーのプロセスを表示します。
  • u - プロセスの所有者であるユーザーを表示します。
  • x - ターミナルにバインドされていないプロセスを表示します。 このオプショングラフィックス アプリケーションに関する情報を検索する場合に重要です。

ps と grep コマンドを組み合わせて使用​​すると、フリーズしたアプリケーションを破棄するために必要な情報をすべて取得できます。

プロセスを見つけるその他の方法

プロセスの PID を名前で検索するには、pidof コマンドがあります。 これを使用するための形式は次のとおりです: pidof+プログラム名。 たとえば、Opera プログラムに関連するすべての PID を検索するには、「pidof Opera」と入力します。

場合によっては、プログラムが実行を完了しても解放されていないことが発生します。 ネットワークポート。 情報を入手するには、次の場所にアクセスしてください この場合 fuser コマンド: fuser -vn tcp 80 を入力する必要があります。80 はスタックしたポートの番号です。 その後は殺してもいいよ Linuxプロセス港で。

プロセスの PID とその名前がわかったら、終了操作に進むことができます。 不要な申請。 これを行うには、2 つのコマンドが使用されます。kill - Linux では ID によってプロセスを強制終了し、killall - 名前によってプログラムの実行を終了します。

Kill コマンド構造: Kill SIGNAL PID。 ここで、SIGNAL は送信されるシグナル、PID はプロセス ID です。

プロセス終了の SIGNAL パラメータは 9 (SIGKILL) です。 したがって、Linux で pid によってプロセスを強制終了するには、コンソールにコマンド kill -9 9578 を入力する必要があります。9578 は一意のプロセス番号です。

プロセス終了コマンドは、次のコマンドを使用して送信できる唯一のコマンドではありません。 システムアプリケーション殺す。 kill -l と入力すると、kill を使用してコマンドに送信できるすべてのコマンドのリストを取得できます。

SIGNAL パラメータが取り得る他の値を知っておくことも役に立ちます。 たとえば、HUP パラメータを使用して、フリーズしたプログラムを再起動できます。 SIGTERM シグナルはプログラムを直ちに中断しませんが、正常にシャットダウンする時間を与えます。つまり、アプリケーションはデータを保存し、実行を完了し、占有されているすべてのリソースを解放します。

Linux でプロセスを名前で強制終了する方法

強制終了するプログラムの名前がわかっている場合は、killall コマンドを使用できます。 たとえば、Opera アプリケーションに関連するすべてのプロセスを強制終了するには、コマンド killall -9 Opera を入力する必要があります。

ただし、このコマンドは、破棄されるプログラムに関連するプロセスを常に終了するとは限りません。 上記のコマンドを実行した後に ps aux | と入力すると、 Opera を grep すると、いくつかのプロセスがまだ実行中であることがわかります。システム キル アプリケーションを使用してプロセスを強制終了するのが最善です。

場合によっては、Linux 上で別のユーザーが実行しているプロセスを強制終了するには、次のことが必要になることがあります。 ルート権。 次に、プロセスを終了するコマンドの前に、sudo コマンドを入力する必要があります。

ユーザーがプロセスを管理するために必要な情報はこれですべてです。 確かに、このトピックは初心者にとって簡単ではありませんが、オペレーティングシステムのすべてのアクションはプロセスを使用して実行されるため、それを習得する必要があります。 それらを制御する方法を学ぶには、少し練習する必要があります。


その安定性にもかかわらず、Linux 上の一部のアプリケーションはフリーズすることがあります。 アプリが応答しなくなったり、動作が非常に遅くなり、適切に閉じることができない場合があります。 「殺す」方法の一つ 実行中のアプリケーション Linux では、これは kill や killall などのコマンドを使用します。 これらのコマンドの使用方法、プロセスの PID の検索方法、および SIGKILL シグナルの送信方法を見てみましょう。

プロセスとは、システム上で実行されているプログラムのコピーを意味します。 たとえば、3 つの電卓ウィンドウ (例: gcalctool) が開いている場合、それは 3 つのプロセスが実行されていることを意味します。

ハングしたプロセスの PID を見つける

Linux の各プロセスには、PID と呼ばれる独自の識別子があります。 プロセスを停止する前に、その PID を確認する必要があります。 これを行うには、ps および grep コマンドを使用します。 psコマンドは、システム内のアクティブなプロセスのリストとそれらに関する情報を表示するように設計されています。 grepコマンド ps と同時に (チャネル内で) 実行され、ps コマンドの結果を検索します。 コマンドラインで実行すると、すべてのプロセスを一覧表示できます。

ただし、通常、リストは非常に大きいため、「強制終了」したいプロセスを見つけるのはそれほど簡単ではありません。 ここで grep コマンドが役に立ちます。 たとえば、gcalctool という名前のプロセスに関する情報を検索するには、次のコマンドを実行します。

追伸 grep gcalctool

grep コマンドは ps コマンドの結果を検索し、文字列 (単語) gcalctool を含む行のみが出力されます。 ここで興味深い詳細が 1 つあります。たとえば、gcalctool アプリケーションを実行していない場合、次のコマンドを実行した後、 追伸 | grep gcalctoolあなたは受け取ります:

$ ps axu | grep gcalctool yuriy 25587 0.0 0.0 10636 884 pts/2 S+ 10:20 0:00 grep --color=auto gcalctool

つまり、コマンドのパラメータとして単語 gcalctool を指定し、コマンド出力内で grep 自体が見つかったので、grep プロセス自体を取得しました。 ps.

gcalctool プロセスが実行中の場合、次の結果が得られます。

ゆり@yuriy-NIX:~$ ps axu | grep gcalctool yuriy 25609 7.6 0.4 500840 17964 ? Sl 10:20 0:00 gcalctool yuriy 25624 0.0 0.0 10640 884 ポイント/2 S+ 10:21 0:00 grep --color=auto gcalctool

ここで次の行に注目します。 ユリ 25609 7.6 0.4 500840 17964 ? Sl 10:20 0:00 gcalctool」 数値 25609 は、gcalctool プロセスの PID です。

プロセスの PID を確認する別の簡単な方法があります。これは、 pidofコマンド、プロセス名をパラメータとして受け取り、その PID を出力します。 pidof コマンドの実行例:

$pidof gcalctool 25609

kill コマンドでプロセスを「強制終了」します。

プロセスの PID がわかっている場合は、プロセスを強制終了できます キルコマンド。 kill コマンドはプロセスの PID をパラメータとして受け取ります。 たとえば、プロセス番号 25609 を強制終了してみましょう。

25609 を殺す

一般に、kill コマンドはプロセスにシグナルを送信することを目的としています。 デフォルトでは、送信するシグナルを指定しない場合、SIGTERM シグナル (単語終端から) が送信されます。 SIGTERM はプロセスを終了するように指示します。 各信号には独自の番号が付いています。 SIGTERM には 15 という番号が付けられています。kill コマンドが送信できるすべてのシグナル (およびその番号) のリストは、次のコマンドを実行して取得できます。 殺す -l。 SIGKILL シグナル (番号 9) をプロセス 25609 に送信するには、コマンド ラインで次を実行します。

キル -9 25609

SIGTERM シグナルはプロセスを停止しない可能性があります (たとえば、シグナルが傍受またはブロックされた場合) が、SIGKILL は傍受または無視できないため、常にプロセスを強制終了します。

killall コマンドでプロセスを強制終了します

キルオールコマンド Linux では、同じ名前のすべてのプロセスを「強制終了」するように設計されています。 プロセスの PID を知る必要がないため、これは便利です。 たとえば、gcalctool という名前のプロセスをすべて閉じたいとします。 ターミナルで実行します:

Killall gcalctool

killall コマンドは、kill と同様に、デフォルトで SIGTERM シグナルを送信します。 別の信号を送信するには、オプションを使用する必要があります -s。 例えば:

Killall -s 9 gcalctool

結論

一部のプロセスは以下では停止できません 一般ユーザー。 たとえば、プロセスがシステム上の root または別のユーザーとして実行された場合、kill および killall コマンドは、sudo (Ubuntu の場合) を追加してスーパーユーザーとして実行する必要があります。

須藤キル123

GUI (GNOME など) で作業しているときに、ターミナル エミュレータを開いてハングしたプロセスを停止できない場合があります。 その後、キーを使用して仮想コンソールに切り替えることができます Ctrl+Alt+F1にログインし、そこからコマンドを実行します。 そして、クリックして戻ります Ctrl+Alt+F7.

コマンドの使用に関するヘルプは、man コマンドで取得できます。

男 ps 男 grep 男 pidof 男 kill 男 killall

いずれにせよ、遅かれ早かれ、バグのあるプロセスやハングしたプロセスを強制終了する必要に直面することになります。 Linux。 はい、はい、Linux の一部のアプリケーションは、その安定性にもかかわらずフリーズすることがあります。 このような場合に、素晴らしいユーティリティが役に立ちます。 殺す。 このユーティリティの使用方法を見てみましょう。

それぞれの工程で Linuxという独自の識別子があります PID。 プロセスを停止する前に、プロセスを定義する必要があります PID。 肝心なのは、この識別子を見つける必要があるということです。たとえば、任意のプログラムを開いて、その識別子を見つけてみましょう。

ハングしたプロセス ID

検索するにはコマンドが必要です psとgrep。 チーム ps- システム内のアクティブなプロセスのリストとそれらに関する情報、およびコマンドが表示されます。 grep- コマンドの結果を検索します ps。 それでは、ターミナルを開いてみましょう( Ctrl+Alt+T) アクティブなプロセスを確認します

追伸

すでにお気づきのとおり、リストは非常に大きいため、必要なプロセスを見つけるためにリストをスクロールするのは時間の無駄です。これには素晴らしいプログラムを使用します。 grep。 必要なプロセスを見つけるには、grep を入力した後、探しているアプリケーションを指定します。 Viber を例として使用すると、次のようになります。

追伸 | grep バイバーポール 22685 0.0 1.9 647748 76620 ? Sl 13:01 0:04 /usr/bin/python /usr/bin/viberwrapper-indicator pol 22697 3.0 5.4 5402084 216120 ? Sl 13:01 4:52 /opt/viber/Viber pol 24068 0.0 0.0 17192 2216 pts/0 S+ 15:41 0:00 grep --color=auto viber

最初の行には、実行中の viberwrapper-indicator アプリケーションが含まれており、このアプリケーションについて読むことができます。 2 行目は Viber そのもので、今日「消滅」させますが、3 行目は何でしょうか? 3番目のプロセスはプロセスそのものです grep検索パラメーターとして単語 viber を指定し、grep がコマンド出力内でそれ自体を見つけたためです。 ps.

もう一つ簡単に調べる方法があります PIDプロセスはコマンドです ピドフ、プロセス名をパラメータとして受け取り、その PID を出力します。 大文字と小文字に注意してください。プロセス名が大文字で始まり、小文字で記述すると (またはその逆の場合)、pidof は存在しません。

ピドフ・バイバー

すでにお気づきかもしれませんが、アクティブな Viber アプリケーションでは 3 行が表示されました。

プロセスの完了、より簡単に言うと「殺人」

これで Viber プロセス ID がわかったので、それを「強制終了」する機会ができました。

22697を殺す

一般に、kill コマンドはプロセスにシグナルを送信することを目的としています。 デフォルトでは、属性を指定しない場合、SIGTERM シグナル (単語終了から) が送信されます。 SIGTERM はプロセスを終了するように指示します。 各信号には独自の番号が付いています。 SIGTERM には 15 という番号が付けられています。コマンドが送信できるすべてのシグナル (およびその番号) のリスト 殺すを実行することで導出できます。 殺す -l。 SIGKILL シグナル (番号 9) をプロセス 22697 に送信するには、コマンド ラインで次のコマンドを実行します。

キル -9 22697

SIGTERM シグナルはプロセスを停止しない可能性があります (たとえば、シグナルが傍受またはブロックされた場合) が、SIGKILL は傍受または無視できないため、常にプロセスを強制終了します。
コマンドを実行すると、属性の完全なリストを表示できます。

殺す -l

kill コマンドの -9 (または KILL) 引数は、絶対に必要な場合にのみ、POSIX 準拠のシステムで使用してください。 なぜ? KILL シグナルはプロセスによって処理できません。 これは、 kill -9 でプロセスを強制終了した後、子プロセスがメモリ内に残り、「孤立」することを意味します。 ファイルシステム一時ファイルで詰まり、共有メモリセグメントがアクティブになり、ソケットがハングし、atexit(3) 関数がまったく実行されなくなります。 その結果、予期しないデバッグが困難な問題が発生するリスクがあります。

代わりに、デフォルトの TERM シグナルを使用し、問題の少ないシグナルが効果がないことが判明した場合にのみ KILL を使用します。

$kill 6738
$ キル -INT 6738
$ キル -HUP 6738
$ キル -KILL 6738

KILL シグナルでもプロセスを終了できない場合、プロセスは I/O でスタックしているか、その他の強制終了できない状態になっている可能性があります。 場合によっては、再起動するか、問題が発生したネットワーク ドライブを強制的にアンマウントする必要があります。

問題のあるアプリケーションを扱う場合は、デフォルトの kill -KILL を使用できます。たとえば、古いバージョンの Netscape は KILL シグナルのみで終了することがよくあります。 ただし、これはルールのまれな例外です。これらの既知のアプリケーションに対してのみ、KILL を使用してください。

プロセスの終了時に問題が発生しました

異なるシグナルを連続して送信すると、次の問題が発生する可能性があります。 まず、プロセスが正常に終了するまでに数秒、場合によっては数十秒かかる場合があります。 私が使用した製品の 1 つは、TERM 信号を受信して​​から正しく終了するまでに 30 秒以上かかりました。 幸いなことに、この機能はテスト中に発見されたため、このケースに適したスクリプトが作成されました。 次に、TERM 信号と KILL 信号の間に、新しいプロセスがその ID を引き継いでいる間に、古いプロセスが終了する状況が発生することがあります。 プロセス回転率が増加したシステムと、カーネルが PID を割り当てるシステム ランダムな順序たとえば、OpenBSD。 新しいプロセスは同じ親のフォークであり、同じ名前を持つ可能性があるため、プロセス名またはその PPID を確認することが常に役立つとは限りません。そのため、特に偏執的なスクリプトでは、シグナルを送信する前にプロセスの作成時間やその他のメタデータもチェックする可能性があります。 このような状況はまれに発生する可能性がありますが、重要なプロセスに対処する必要がある場合は考慮する価値があります。

プロセス終了信号

プロセス終了シグナルは名前または シリアルナンバー: kill -1 と kill -HUP は同等です。 ただし、-1 引数を指定すると入力ミスが起こりやすく、シグナルが別のプロセスまたはプロセスのグループに送信される可能性があるため、シグナル名を使用する方が安全です。 また、コードを読む人にどのような種類のシグナルが送信されているかをよりよく理解できるように、スクリプトでは常に名前を使用するようにしてください。

HUP 信号はシェルをフリーズするため、 良い方法入力を待機しているシェルのハングを解消するか、SSH セッションを閉じます。

もっと 詳細情報プロセス終了シグナルについては、