ウェブサイト検索

Linuxにおけるプロセスに関するすべての知識 [包括的ガイド]


この記事では、プロセスの基本的な理解を深め、特定のコマンドを使用してLinuxでプロセスを管理する方法を簡単に見ていきます。

プロセスとは、実行中のプログラムを指し、プログラムの実行インスタンスです。プログラムの命令、ファイルから読み取ったデータ、他のプログラム、またはシステムユーザーからの入力で構成されています。

プロセスの種類

Linuxには基本的に2種類のプロセスがあります。

  • フォアグラウンドプロセス(対話型プロセスとも呼ばれる) – これらは、ターミナルセッションを介して初期化され、制御されます。言い換えれば、こうしたプロセスを開始するためには、システムに接続されたユーザーが必要です。これらはシステムの機能やサービスの一部として自動的に開始されたわけではありません。
  • バックグラウンドプロセス(非対話型/自動プロセスとも呼ばれます)- ターミナルに接続されていないプロセスであり、ユーザーの入力を期待しません。

デーモンとは何ですか

これらは、システム起動時に開始され、永遠にサービスとして実行され続ける特別な種類のバックグラウンドプロセスです;それらは死にません。自発的にシステムタスクとして開始されます(サービスとして実行される)。ただし、ユーザーはinitプロセスを介してそれらを制御できます。

Linuxにおけるプロセスの作成

新しいプロセスは通常、既存のプロセスが自分自身の正確なコピーをメモリ内に作成するときに生成されます。子プロセスは親と同じ環境を持ちますが、プロセスID番号だけが異なります。

Linuxで新しいプロセスを作成するための2つの従来の方法があります。

  • system()関数の使用 - この方法は比較的簡単ですが、効率が悪く、特定のセキュリティリスクが大きいです。
  • fork() と exec() 関数の使用 – この技術は少し高度ですが、より大きな柔軟性、速度、そしてセキュリティを提供します。

Linuxはプロセスをどのように識別しますか?

Linuxはマルチユーザーシステムであるため、異なるユーザーがシステム上でさまざまなプログラムを実行でき、各プログラムの実行インスタンスはカーネルによって一意に識別されなければなりません。

プログラムはそのプロセスID(PID)と親プロセスのID(PPID)によって特定されるため、プロセスはさらに以下のように分類できます。

  • 親プロセス - これは実行時に他のプロセスを作成するプロセスです。
  • 子プロセス - これらのプロセスは、実行中に他のプロセスによって作成されます。

初期化プロセス

Init プロセスは、システム上のすべてのプロセスの母(親)であり、Linux システムが起動する際に最初に実行されるプログラムです。これは、システム上の他のすべてのプロセスを管理します。カーネル自体によって開始されるため、原則として親プロセスを持ちません。

initプロセスは常にプロセスIDが1です。これは、すべての孤児プロセスの養親として機能します。

プロセスのIDを見つけるには、pidofコマンドを使用できます。

# pidof systemd
pidof top
pidof httpd

現在のシェルのプロセスIDと親プロセスIDを見つけるには、次のコマンドを実行してください。

$ echo $$
echo $PPID

Linuxでプロセスを開始する

コマンドやプログラム(例えば、cloudcmd - CloudCommander)を実行すると、システム内にプロセスが開始されます。次のようにフォアグラウンド(対話型)プロセスを開始することができます。これにより、ターミナルに接続され、ユーザーは入力を送信できます。

# cloudcmd

Linux バックグラウンドジョブ

バックグラウンドでプロセスを開始するには(非対話型)、& シンボルを使用します。ここでは、プロセスはフォアグラウンドに移るまでユーザーからの入力を読みません。

# cloudcmd &
jobs

プロセスを一時停止するために [Ctrl + Z] を使用してバックグラウンドに送信することもできます。これにより、SIGSTOP 信号がプロセスに送信され、その操作が停止します。プロセスはアイドル状態になります。

# tar -cf backup.tar /backups/*  #press Ctrl+Z
jobs

上記の一時停止されたコマンドをバックグラウンドで実行し続けるには、bgコマンドを使用します:

# bg

バックグラウンドプロセスをフォアグラウンドに送るには、次のように fg コマンドとジョブIDを併用します:

# jobs
fg %1

あなたにおすすめ: Linuxコマンドをバックグラウンドで開始し、ターミナルでプロセスを分離する方法

Linuxにおけるプロセスの状態

実行中、プロセスはその環境や状況に応じて、ある状態から別の状態に変更されます。Linuxにおいて、プロセスには以下のような可能な状態があります:

  • 実行中 – ここでは実行中(これはシステム内の現在のプロセスです)か、実行準備中(CPUのいずれかに割り当てられるのを待っています)です。
  • 待機中 – この状態では、プロセスがイベントが発生するのを待つか、システムリソースを待っています。さらに、カーネルは待機プロセスの二種類を区別します; 割り込み可能な待機プロセス – 信号によって中断可能で、割り込み不可能な待機プロセス – ハードウェアの条件に直接待機しており、いかなるイベント/信号によっても中断されることはありません。
  • 停止 - この状態では、プロセスが停止しています。通常は信号を受け取ることによって行われます。例えば、デバッグ中のプロセスです。
  • ゾンビ – ここでは、プロセスは終了しており、停止していますが、プロセステーブルにはまだエントリがあります。

Linuxでアクティブなプロセスを表示する方法

システム上で実行中のプロセスを表示/リストするためのLinuxツールはいくつかあり、伝統的で良く知られているものはpsコマンドとtopコマンドの2つです。

1. psコマンド

下に示すように、システム上のアクティブプロセスの選択に関する情報を表示します:

# ps 
ps -e | head 

2. トップ - システム監視ツール

トップは、下のスクリーンショットに示されているように、実行中のシステムの動的なリアルタイムビューを提供する強力なツールです。

# top 

これを読んで、Linuxの12のトップコマンド例についてのより多くの使い方の例を確認してください。

3. グランス - システム監視ツール

glancesは、先進的な機能を備えた比較的新しいシステム監視ツールです。

# glances

包括的な使用ガイドについては、次をお読みください: Glances – Linuxのための高度なリアルタイムシステム監視ツール

アクティブなプロセスを一覧表示するために使用できる他のいくつかの便利なLinuxシステム監視ツールがあります。詳細については、以下のリンクを開いてください:

  1. Linux パフォーマンスを監視するための 20 のコマンドラインツール
  2. 役立つLinux監視ツール13選

Linuxでプロセスを制御する方法

Linux には、プロセスを制御するためのいくつかのコマンドがあり、kill、pkill、pgrep、killall などがあります。以下は、それらの基本的な使用例です。

$ pgrep -u tecmint top
kill 2308
pgrep -u tecmint top
pgrep -u tecmint glances
pkill glances
pgrep -u tecmint glances

これらのコマンドを詳細に使用する方法を学ぶために、Linuxでアクティブなプロセスを終了させるためには、以下のリンクを開いてください:

  1. Linuxプロセスを終了するためのkill、pkill、およびkillallコマンドのガイド
  2. Linuxで実行中のプロセスを見つけて終了する方法

システムがフリーズしたときに、Linuxで応答しないアプリケーションを終了するためにそれらを使用できることに注意してください。

プロセスへの信号の送信

Linuxにおけるプロセス制御の基本的な方法は、それらに信号を送ることです。プロセスに送ることのできる複数の信号があります。すべての信号を見るには、次のように実行してください:

$ kill -l

プロセスに信号を送るには、前述のkill、pkill、またはpgrepコマンドを使用します。ただし、プログラムは信号を認識するようにプログラムされている場合にのみ、信号に応答することができます。

ほとんどの信号はシステムによる内部使用や、プログラマーがコードを書くときに使用されます。以下は、システムユーザーにとって便利な信号です:

  • SIGHUP 1 – 制御端末が閉じられたときにプロセスに送信される。
  • SIGINT 2 は、ユーザーが [Ctrl+C] を押してプロセスを中断する際に、その制御端末によってプロセスに送信される信号です。
  • SIGQUIT 3 - ユーザーが終了信号 [Ctrl+D] を送信した場合にプロセスに送信されます。
  • SIGKILL 9 – この信号はプロセスを即座に終了させ(殺す)、プロセスはクリーンアップ操作を行いません。
  • SIGTERM 15 – これはプログラム終了信号です(killはデフォルトでこれを送信します)。
  • SIGTSTP 20 – 制御端末によってプロセスに送信され、停止を要求する(端末停止);ユーザーが[Ctrl+Z]を押すことで開始される。

以下は、FirefoxアプリケーションがフリーズしたときにPIDを使用してプロセスを終了するためのkillコマンドの例です:

$ pidof firefox
kill 9 2687
OR
kill -KILL 2687
OR
kill -SIGKILL 2687  

アプリケーションをその名前で終了するには、pkillまたはkillallを以下のように使用します:

$ pkill firefox
killall firefox 

Linuxのプロセス優先度の変更

Linuxシステムでは、すべてのアクティブなプロセスには優先度と特定のナイス値があります。優先度が高いプロセスは、通常、優先度が低いプロセスよりも多くのCPU時間を得ることになります。

しかし、ルート権限を持つシステムユーザーは、niceおよびreniceコマンドを使用してこれに影響を与えることができます。

topコマンドの出力から、NIはプロセスのナイス値を示します。

$ top  

nice コマンドを使用して、プロセスのニース値を設定します。通常のユーザーは、自分が所有するプロセスに対して、0から20の範囲でニース値を割り当てることができることに注意してください。
負のニース値を使用できるのは、ルートユーザーのみです。

プロセスの優先度をreniceするには、次のようにreniceコマンドを使用します:

$ renice +8  2687
renice +8  2103

Linuxプロセスの管理と制御方法に関する便利な記事をチェックしてください。

  1. Linuxプロセス管理:ブート、シャットダウン、そしてその間のすべて
  2. バッチモードで‘top’を使ってメモリ使用量による上位15のプロセスを見つける
  3. Linuxで最高のメモリとCPU使用率のトップ実行プロセスを見つける
  4. LinuxでPID番号を使用してプロセス名を見つける方法

それでは、今はこれで終わります!質問や追加のアイデアがあれば、下のフィードバックフォームを通じてお知らせください。

関連記事: