ウェブサイト検索

Linux のプロセスについて知っておくべきことすべて [総合ガイド]


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

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

プロセスの種類

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

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

デーモンとは

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

Linux でのプロセスの作成

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

Linux で新しいプロセスを作成するために使用される従来の方法は 2 つあります。

  • System() 関数の使用 – この方法は比較的単純ですが、非効率であり、重大なセキュリティ リスクを伴います。
  • fork() および exec() 関数の使用 – この手法は少し高度ですが、セキュリティとともに柔軟性、速度が向上します。

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

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

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

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

初期化プロセス

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

init プロセスのプロセス ID は常に 1 です。すべての孤立したプロセスの養親として機能します。

pidof コマンドを使用してプロセスの ID を見つけることができます。

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

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

jobs
fg %1

こちらもおすすめです: バックグラウンドで Linux コマンドを起動し、ターミナルでプロセスを切断する方法

Linux のプロセスの状態

実行中、プロセスは環境/状況に応じてある状態から別の状態に変化します。 Linux では、プロセスには次のような状態が考えられます。

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

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

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

1.psコマンド

以下に示すように、システム上のアクティブなプロセスの選択に関する情報が表示されます。

ps 
ps -e | head 

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

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

top 

その他の主な使用例については、こちらをお読みください: Linux での 12 の TOP コマンド例

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

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

glances

包括的な使用ガイドについては、「Glances – An Advanced Real Time System Monitoring Tool for Linux」を参照してください。

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

  1. Linuxのパフォーマンスを監視する20のコマンドラインツール
  2. より便利な 13 の Linux 監視ツール

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 システムでは、すべてのアクティブなプロセスに優先順位と特定の Nice 値があります。通常、優先度の高いプロセスは、優先度の低いプロセスよりも多くの CPU 時間を取得します。

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

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

top  

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

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

renice +8  2687
renice +8  2103

Linux プロセスを管理および制御する方法に関するいくつかの役立つ記事をご覧ください。

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

それは今のところすべてです!ご質問や追加のアイデアがありましたら、以下のフィードバック フォームからお知らせください。