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

killとkillallを使用したLinuxでのプロセスの管理

Linuxでは、すべてのプログラムとデーモンが「プロセス」です。ほとんどのプロセスは、単一の実行中のプログラムを表します。他のプログラムは、特定の事柄が発生するのをリッスンして応答するプロセスなど、他のプロセスを分岐させることができます。また、各プロセスには、ある程度のメモリと処理能力が必要です。実行しているプロセスが多いほど、必要なメモリとCPUサイクルも多くなります。私の7年前のラップトップのような古いシステムや、Raspberry Piのような小さなコンピューターでは、バックグラウンドで実行しているプロセスを監視していれば、システムを最大限に活用できます。

psを使用して実行中のプロセスのリストを取得できます 指図。通常、 psを与えることをお勧めします 出力に詳細情報を表示するためのいくつかのオプション。 -eを使用するのが好きです システムで実行されているすべてのプロセスを表示するオプション、および -f 各プロセスに関する完全な詳細を取得するオプション。次にいくつかの例を示します。

$ ps
    PID TTY          TIME CMD
  88000 pts/0    00:00:00 bash
  88052 pts/0    00:00:00 ps
  88053 pts/0    00:00:00 head
$ ps -e | head
    PID TTY          TIME CMD
      1 ?        00:00:50 systemd
      2 ?        00:00:00 kthreadd
      3 ?        00:00:00 rcu_gp
      4 ?        00:00:00 rcu_par_gp
      6 ?        00:00:02 kworker/0:0H-events_highpri
      9 ?        00:00:00 mm_percpu_wq
     10 ?        00:00:01 ksoftirqd/0
     11 ?        00:00:12 rcu_sched
     12 ?        00:00:00 migration/0
$ ps -ef | head
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 13:51 ?        00:00:50 /usr/lib/systemd/systemd --switched-root --system --deserialize 36
root           2       0  0 13:51 ?        00:00:00 [kthreadd]
root           3       2  0 13:51 ?        00:00:00 [rcu_gp]
root           4       2  0 13:51 ?        00:00:00 [rcu_par_gp]
root           6       2  0 13:51 ?        00:00:02 [kworker/0:0H-kblockd]
root           9       2  0 13:51 ?        00:00:00 [mm_percpu_wq]
root          10       2  0 13:51 ?        00:00:01 [ksoftirqd/0]
root          11       2  0 13:51 ?        00:00:12 [rcu_sched]
root          12       2  0 13:51 ?        00:00:00 [migration/0]

最後の例は、最も詳細を示しています。各行のUID(ユーザーID)は、プロセスを所有するユーザーを示します。 PID(プロセスID)は各プロセスの数値IDを表し、PPID(親プロセスID)はこのプロセスを生成したプロセスのIDを示します。どのUnixシステムでも、プロセスはPID 1からカウントアップします。カーネルが起動すると、最初に実行されるプロセスです。ここでは、 systemd kthreaddを生成した最初のプロセスです 。そしてkthreadd rcu_gpを含む他のプロセスを作成しました 、 rcu_par_gp 、および他の多くのもの。

キルコマンドを使用したプロセス管理

システムはほとんどのバックグラウンドプロセスを独自に処理するため、それらについて心配する必要はありません。通常はアプリケーションを実行して、作成したプロセスの管理に関与するだけで済みます。多くのアプリケーションは一度に1つのプロセスを実行しますが(音楽プレーヤー、ターミナルエミュレーター、またはゲームについて考えてみてください)、他のアプリケーションはバックグラウンドプロセスを作成する場合があります。これらの一部は、アプリケーションを終了したときに実行を継続する可能性があるため、次にアプリケーションを起動したときにすぐに作業に戻ることができます。

GoogleのChromeブラウザのオープンソースベースであるChromiumを実行すると、プロセス管理が問題になります。 Chromiumは私のラップトップをかなりハードに動作させ、多くの余分なプロセスを実行します。現在、これらのChromiumプロセスが5つのタブだけを開いた状態で実行されているのを確認できます:

$ ps -ef | fgrep chromium
jhall      66221   [...]  /usr/lib64/chromium-browser/chromium-browser [...]
jhall      66230   [...]  /usr/lib64/chromium-browser/chromium-browser [...]
[...]
jhall      66861   [...]  /usr/lib64/chromium-browser/chromium-browser [...]
jhall      67329   65132  0 15:45 pts/0    00:00:00 grep -F chromium

一部の行を省略しましたが、20個のChromiumプロセスと1個の grep があります 文字列「chromium」を検索しているプロセス

$ ps -ef | fgrep chromium | wc -l
21

しかし、Chromiumを終了した後も、これらのプロセスは開いたままです。それらをどのようにシャットダウンし、それらのプロセスが使用しているメモリとCPUを再利用しますか?

キル コマンドを使用すると、プロセスを終了できます。最も単純なケースでは、殺すと言います 停止したいもののPID。たとえば、これらの各プロセスを終了するには、キルを実行する必要があります 20個のChromiumプロセスIDのそれぞれに対してコマンドを実行します。これを行う1つの方法は、Chromium PIDを取得するコマンドラインと、 killを実行する別のコマンドラインを使用することです。 そのリストに対して:

$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}'
66221
66230
66239
66257
66262
66283
66284
66285
66324
66337
66360
66370
66386
66402
66503
66539
66595
66734
66848
66861
69702

$ ps -ef | fgrep /usr/lib64/chromium-browser/chromium-browser | awk '{print $2}' > /tmp/pids
$ kill $( cat /tmp/pids)

これらの最後の2行が重要です。最初のコマンドラインは、ChromiumブラウザのプロセスIDのリストを生成します。 2番目のコマンドラインはkillを実行します プロセスIDのリストに対するコマンド。

killallコマンドの紹介

多数のプロセスを一度に停止する簡単な方法は、 killallを使用することです。 指図。名前から推測できるように、 killall 名前に一致するすべてのプロセスを終了します。つまり、このコマンドを使用して、すべての不正なChromiumプロセスを停止できます。これは次のように簡単です:

$ killall /usr/lib64/chromium-browser/chromium-browser

ただし、 killallには注意してください 。このコマンドは、指定したものと一致するすべてのプロセスを終了できます。そのため、最初に ps -efを使用するのが好きです。 実行中のプロセスを確認してから、 killallを実行します 停止したいコマンドへの正確なパスに対して。

-iを使用することもできます または-インタラクティブ killallに質問するオプション 各プロセスを停止する前にプロンプ​​トを表示します。

killall -oを使用して特定の時間より古いプロセスを選択するオプションもサポートします または-より古い オプション。これは、たとえば、数日間無人で実行されている一連の不正なプロセスを発見した場合に役立ちます。または、最近開始した暴走プロセスなど、特定の時間よりも若いプロセスを選択することもできます。 -yを使用します または-より若い これらのプロセスを選択するオプション。

プロセスを管理するその他の方法

その他のLinuxリソース

  • Linuxコマンドのチートシート
  • 高度なLinuxコマンドのチートシート
  • 無料のオンラインコース:RHELの技術概要
  • Linuxネットワーキングのチートシート
  • SELinuxチートシート
  • Linuxの一般的なコマンドのチートシート
  • Linuxコンテナとは何ですか?
  • 最新のLinux記事

プロセス管理は、システムメンテナンスの重要な部分になる可能性があります。 UnixおよびLinuxシステム管理者としての私の初期のキャリアでは、エスケープされたジョブを強制終了する機能は、システムを適切に実行し続けるための便利なツールでした。最新のLinuxデスクトップでは、不正なプロセスを強制終了する必要はないかもしれませんが、強制終了は知っています。 およびkillall 物事が最終的にうまくいかないときにあなたを助けることができます。

プロセスを管理する他の方法を探すこともできます。私の場合、キルを使用する必要はありませんでした またはkillall ブラウザを終了した後、バックグラウンドのChromiumプロセスを停止します。 Chromiumには、それを制御するための簡単な設定があります。

それでも、システムで実行されているプロセスを監視し、必要に応じてそれらを管理する方法を知っておくことは常に良い考えです。


Linux
  1. systemd-udevdを使用してLinuxで接続されたハードウェアを管理する

  2. 古いプロセスを見つけて (そして kill して)

  3. LinuxでゾンビとD状態のプロセスを強制終了する最良の方法

  1. Linuxでpartedを使用してパーティションを作成および管理する

  2. Ubuntu Linux でのプロセスの管理

  3. Linux:ゾンビ プロセスを見つけて強制終了する

  1. KWriteとKateを使用してLinuxでテキストを編集する

  2. LinuxターミナルをtmuxとGitでカスタマイズする

  3. Linuxで実行中のプロセスを強制終了する方法