Linuxでのハロウィーン:ゾンビプロセスを殺す方法

ハロウィンスタンプ

死者の日が近づいています。そのため、LxAからこの小さなチュートリアルを実行して、 ゾンビプロセス そしてどうやって彼らを殺すことができるか。 最初に言うことは、ゾンビプロセスとは何かということです。つまり、ご存知のように、Linuxカーネルにはプロセスを管理するサブシステムがあり、スケジューラーと連携してCPU処理フローを作成、変更、送信または削除します。プロセスを強制終了します。 カーネルのこの部分は、他のUnixライクなシステムと同様に、プロセスのさまざまな状態を区別します...

だから私たちはそれを見つけることができます プロセス スリープ(S)状態、つまりスリープ状態にすることができます。 また、現在実行中または実行中の実行状態(R)のプロセス、参加待ちの待機中のプロセス(D)、gestpt(T)または一時停止、ゾンビ(Z)または死亡したプロセスもあります。 ゾンビまたはデッドプロセスは、すでに正常に終了しているが、Linuxがまだプロセステーブルに保存しているため、特定のシステムリソースがハイジャックされているプロセスです。 プロセスが終了すると、この状態のままではなく、完了してカーネルがリソースを解放し、他のプロセスがそれらを使用できるようにすることをすでに知っています。基本的には、占有されているRAMを解放します...

さて、このタイプのゾンビプロセスがあることは面白くないので、それほど頻繁ではありませんが、ここに示されているようにそれらを検索して排除することができます。 最初に行うことは、ディストリビューションにゾンビプロセスがあるかどうかを確認することです。そのために、自分で解決できます。 topやpsのようなツール。 たとえば、次のXNUMXつのオプションのいずれかです。

ps -el | grep 'Z'

ps aux | grep defunct

そして、一度検出されると、 彼を殺せ 直接:

kill -HUP `ps -A -ostat,ppid,pid,cmd | grep -e ‘^[Zz]’ | awk ‘{print $2}’`

別の方法は親プロセスを見つけることですが、 ゾンビプロセスを殺す あなたが推測したように、あなたはそれを維持する親プロセスを殺さなければなりません:

ps -eo pid,ppid | grep <PID>

kill -9 <PPID>

交換する必要があります見つけたゾンビプロセスのIDで、killでキルするには、親プロセスのIDを使用して置き換えます例では、明らかに。


コメントを残す

あなたのメールアドレスが公開されることはありません。 必須フィールドには付いています *

*

*

  1. データの責任者:AB Internet Networks 2008 SL
  2. データの目的:SPAMの制御、コメント管理。
  3. 正当化:あなたの同意
  4. データの伝達:法的義務がある場合を除き、データが第三者に伝達されることはありません。
  5. データストレージ:Occentus Networks(EU)がホストするデータベース
  6. 権利:いつでも情報を制限、回復、削除できます。

  1.   作ったボール

    良いサイト!
    彼らはいつも私たちをトラブルから解放します。

    どこが言う:
    別の方法は親プロセスを見つけることですが、ゾンビプロセスを強制終了するには、それをサポートする親プロセスを強制終了する必要があります。

    1 | ps -eo pid、ppid | grep
    2|
    3 | -9を殺す

    見つけたゾンビプロセスのIDを置き換える必要があり、killでそれを強制終了するには、明らかに、例で置き換えている親プロセスのIDを使用します。

    スクリプトを追加できます。

    $ 猫 killppid.sh
    #!/ bin / bashに
    kill -9 $(ps -eo pid、ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    もちろん、通常のユーザーが常に実行するタスクではありません。
    これは管理者にとってのみ有用ですが、システム上のすべてのプロセスを強制終了する可能性があるため、rootとして実行するのは危険です。

    人間の殺害では、それはこのメモを持っています:

    注シェル(コマンドラインインタープリター)には、killコマンドが組み込まれている場合があります。 してもいいです
    競合を解決するには、ここで/ bin / killとして説明されているコマンドを実行する必要があります。

    Bashにはそのコマンドがあります。これはmanbashの一部です。

    殺す[-ssigspec | -nシグナム| -sigspec] [pid | jobspec]..。
    kill -l | -L [sigspec | exit_status]
    sigspecまたはsignumで指定されたシグナルを、pidまたはjobで指定されたプロセスに送信します
    スペックsigspecは、SIGKILLなどの大文字と小文字を区別しないシグナル名です(または
    SIGプレフィックスなし)または信号番号。 signumはシグナル番号です。 もしも
    sigspecが存在しない場合、SIGTERMが想定されます。 -lの引数は、
    信号名。 -lを指定したときに引数が指定されている場合、
    引数に対応するシグナルが一覧表示され、戻りステータスは0です。
    -lのexit_status引数は、シグナル番号または
    シグナルによって終了したプロセスの終了ステータス。 -Lオプションは同等です
    -lに貸し出しました。 少なくともXNUMXつの信号が正常に送信された場合、killはtrueを返します。
    エラーが発生した場合、または無効なオプションが検出された場合はfalse。

    最初に、bashがプロセスを保護して問題を回避する方法を説明しますが、rootとして実行する安全なスクリプトを作成する方法がわかりません。
    私が考えることができる唯一のことは、このようにそれを保護することです:

    $ 猫 killppid.sh
    #!/ bin / bashに
    if [$ USER == "root"]
    次にecho $ 0をrootとして実行しないでください!!! 危険です!
    終了する
    fi

    kill -9 $(ps -eo pid、ppid | awk '$ 1 ==' $ {1} '{print $ 2}')

    $

    / bin / killではなく、bashのkillを使用します

    私がbashにあまり精通していないことがどうしてわかりますか。
    rootとして実行されている場合でも、子プロセスのユーザーとして実行される安全なスクリプトを作成する方法を知っていますか?
    このように手動で行われるものと同等の何か:

    $ su;
    $ kill -9 $(ps -eo pid、ppid | awk '$ 1 ==' $ {1} '{print $ 2}')