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


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

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

Linuxには、基本的に2つのタイプのプロセスがあります。

  • Foreground processes (also referred to as interactive processes) – these are initialized and controlled through a terminal session. In other words, there has to be a user connected to the system to start such processes; they haven’t started automatically as part of the system functions/services.
  • Background processes (also referred to as non-interactive/automatic processes) – are processes not connected to a terminal; they don’t expect any user input.

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

Linuxでのプロセスの作成

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

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

  • Using The System() Function – this method is relatively simple, however, it’s inefficient and has significantly certain security risks.
  • Using fork() and exec() Function – this technique is a little advanced but offers greater flexibility, speed, together with security.

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

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

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

  • Parent processes – these are processes that create other processes during run-time.
  • Child processes – these processes are created by other processes during run-time.

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

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

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

# pidof systemd
# pidof top
# pidof httpd

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

$ echo $$
$ echo $PPID

コマンドまたはプログラム(たとえば、cloudcmd – CloudCommander)を実行すると、システムでプロセスが開始されます。次のようにフォアグラウンド(インタラクティブ)プロセスを開始できます。これは端末に接続され、ユーザーは入力を送信できます。

# cloudcmd

バックグラウンド(非インタラクティブ)でプロセスを開始するには、記号を使用します。ここでは、プロセスはフォアグラウンドに移動するまでユーザーからの入力を読み取りません。

# cloudcmd &
# jobs

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

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

上記で中断されたコマンドをバックグラウンドで実行し続けるには、bgコマンドを使用します。

# bg

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

# jobs
# fg %1

あなたも好きかもしれません:バックグラウンドでLinuxコマンドを開始し、ターミナルでプロセスを切り離す方法

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

  • Running – here it’s either running (it is the current process in the system) or it’s ready to run (it’s waiting to be assigned to one of the CPUs).
  • Waiting – in this state, a process is waiting for an event to occur or for a system resource. Additionally, the kernel also differentiates between two types of waiting processes; interruptible waiting processes – can be interrupted by signals and uninterruptible waiting processes – are waiting directly on hardware conditions and cannot be interrupted by any event/signal.
  • Stopped – in this state, a process has been stopped, usually by receiving a signal. For instance, a process that is being debugged.
  • Zombie – here, a process is dead, it has been halted but it’s still has an entry in the process table.

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

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

# ps 
# ps -e | head 

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

# top 

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

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

# glances

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

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

  1. 20 Command Line Tools to Monitor Linux Performance
  2. 13 More Useful Linux Monitoring Tools

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. A Guide to Kill, Pkill and Killall Commands to Terminate Linux Processess
  2. How to Find and Kill Running Processes in Linux

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

Linuxでプロセスを制御する基本的な方法は、プロセスにシグナルを送信することです。実行されたすべてのシグナルを表示するために、プロセスに送信できる複数のシグナルがあります。

$ kill -l

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

また、ほとんどのシグナルは、システムが内部で使用するため、またはプログラマーがコードを作成するときに使用します。以下は、システムユーザーに役立つ信号です。

  • SIGHUP 1 – sent to a process when its controlling terminal is closed.
  • SIGINT 2 – sent to a process by its controlling terminal when a user interrupts the process by pressing [Ctrl+C].
  • SIGQUIT 3 – sent to a process if the user sends a quit signal [Ctrl+D].
  • SIGKILL 9 – this signal immediately terminates (kills) a process and the process will not perform any clean-up operations.
  • SIGTERM 15 – this a program termination signal (kill will send this by default).
  • SIGTSTP 20 – sent to a process by its controlling terminal to request it to stop (terminal stop); initiated by the user pressing [Ctrl+Z].

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

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

その名前を使用してアプリケーションを強制終了するには、次のようにpkillまたはkillallを使用します。

$ pkill firefox
$ killall firefox 

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

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

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

$ top  

rootユーザーのみが負のnice値を使用できます。

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

$ renice +8  2687
$ renice +8  2103

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

  1. Linux Process Management: Boot, Shutdown, and Everything in Between
  2. Find Top 15 Processes by Memory Usage with ‘top’ in Batch Mode
  3. Find Top Running Processes by Highest Memory and CPU Usage in Linux
  4. How to Find a Process Name Using PID Number in Linux

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