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

Linuxでのプロセスを理解する

このチュートリアルでは、プロセスとは何か、プロセスの使用方法、Linuxでの管理方法について詳しく説明します。

システム管理者は、おそらくプロセスとやり取りしたことがあります。 さまざまな方法で。

多くのリソースを消費しているプロセスを特定するために、コマンドを実行したい場合があります。 ホスト上で。

ユーザーから、プロセスの1つがスタックしているため、作業を続行するためにプロセスを強制終了する必要があるという電話を受けた可能性があります。

プロセスは実際にはLinuxオペレーティングシステムの中心にあります。カーネル自体によって作成され、Linuxホストで現在実行されている操作を表します。

プロセスはどこにでもあり、バックグラウンドで実行される場合があります または、カスタム操作のために自分で初期化することもできます。

開始を選択できます それら、中断 それら、再開 それらまたは停止 それら。

今日のチュートリアルでは、プロセス、プロセスとは何か、およびオペレーティングシステムでのプロセスの使用方法について詳しく見ていきます。

プロセスに関連するすべてのコマンド、シグナルとは何か、既存のプロセスにより多くの計算リソースを割り当てる方法を発見します。

準備はいいですか?

何を学ぶか

このチュートリアルを最後まで読むことで、次の概念について学ぶことができます

  • 処理するもの であり、それらがどのように作成されるか Linuxシステムの場合
  • プロセスを特定する方法 Linuxシステムの場合
  • どのような背景 およびフォアグラウンド プロセスは
  • どのようなシグナル プロセスと対話するためにそれらをどのように使用できるか
  • pgrepの使用方法 スキルと同様に 効果的にコマンドする
  • niceを使用してプロセスの優先度を調整する方法 およびrenice
  • プロセスアクティビティをリアルタイムで確認する方法 Linuxの場合

これは非常に長いプログラムなので、これ以上面倒なことはせずに、プロセスとは何かについて簡単に説明することから始めましょう。

Linuxプロセスの基本

つまり、プロセスはLinuxホスト上でプログラムを実行しています たとえば、ディスクへの書き込み、ファイルへの書き込み、Webサーバーの実行などの操作を実行します。

プロセスには所有者がいます そしてそれらはプロセスIDによって識別されます ( PIDとも呼ばれます )

一方、プログラム 永続データストレージに保存されている行またはコードまたはマシン命令の行です。

それらはデータストレージ上に置くことも、実行中、つまりプロセスとして実行することもできます。

割り当てられた操作を実行するには、プロセスにリソースが必要です。 :CPU時間メモリ RAM など またはディスクスペース )だけでなく、スワップスペースなどの仮想メモリもあります プロセスが貪欲になりすぎた場合に備えて。

明らかに、プロセスは開始できます 、停止中断 そして殺された

コマンドを発行する前に、カーネル自体によってプロセスがどのように作成および管理されるかを見てみましょう。

Linuxでのプロセスの初期化

すでに述べたように、プロセスはカーネルによって管理されます Linuxの場合。

ただし、Linuxがどのようにプロセスを作成するかを知るために理解する必要のあるコアコンセプトがあります。

デフォルトでは、Linuxシステムを起動すると、Linuxカーネルがメモリにロードされ、RAM内の仮想ファイルシステム( initramfs とも呼ばれます)が提供されます。 )および初期コマンドが実行されます。

これらのコマンドの1つは、Linuxでの最初のプロセスを開始します。

歴史的に、このプロセスはinitプロセスと呼ばれていましたが、最近の多くのLinuxディストリビューションではsystemd初期化プロセスに置き換えられました。

それを証明するには、ホストで次のコマンドを実行します

$ ps -aux | head -n 2

ご覧のとおり、systemdプロセスのPIDは1です。

ツリー表示を使用してシステム上のすべてのプロセスを印刷すると、すべてのプロセスがsystemdの子であることがわかります。

$ pstree

これらの初期化ステップ(初期プロセスの起動を除く)はすべて、カーネルスペースと呼ばれる予約済みスペースで実行されるという事実を強調することは注目に値します。

カーネルスペースは、カーネル用に予約されたスペースです。 重要なシステムツールを適切に実行し、ホスト全体が一貫した方法で実行されていることを確認するため。

一方、ユーザースペースはプロセス用に予約されています ユーザーによって起動され、カーネル自体によって管理されます。

結果として、systemdプロセスは、ユーザースペースで起動される最初のプロセスです。

ForkとExecを使用したプロセスの作成

Linuxでプログラムを作成して実行する場合、通常、2つの主要なステップが含まれます。フォーク および実行

フォーク操作

Forkはクローン操作であり、親プロセスとも呼ばれる現在のプロセスを使用し、新しいプロセスIDを使用して新しいプロセスにクローンを作成します。

フォークすると、すべてが親プロセスからコピーされます:スタックヒープ 、だけでなく、標準入力、標準出力、および標準エラーを意味するファイル記述子。

これは、親プロセスが現在のシェルコンソールに書き込みを行っていた場合、子プロセスもシェルコンソールに書き込みを行うことを意味します。

複製されたプロセスの実行も、親プロセスと同じ命令で開始されます。

操作の実行

Linuxでは、実行操作を使用して、現在のプロセスイメージを別のプロセスのイメージに置き換えます。

前の図では、親プロセスのスタックに3つの命令が残っていることがわかりました。

結果として、命令は新しいプロセスにコピーされましたが、実行したいものとは関係ありません。

exec操作は、プロセスイメージ(つまり、実行する必要のある一連の命令)を別のイメージに置き換えます。

たとえば、bashターミナルでexecコマンドを実行する場合、現在のプロセスイメージ(bashインタープリター)が起動しようとしているコマンドのコンテキストに置き換えられるため、コマンドが完了するとすぐにシェルが終了します。 。

$ exec ls -l

プロセスの作成時に行われたシステムコールを追跡すると、最初に呼び出されたCコマンドがexecコマンドであることがわかります。

シェル環境からのプロセスの作成

シェルコンソールを起動する場合、コマンドを起動する場合とまったく同じ原則が適用されます。

シェルコンソールは、ユーザーからの入力を待つプロセスです。

また、Enterキーを押すと、bashインタープリターが起動し、コマンドを実行するための環境が提供されます。

ただし、シェルは前に説明した手順に従います。

Enterキーを押すと、シェルは子プロセスにフォークされます それはあなたのコマンドを実行する責任があります。シェルは、子プロセスの実行が終了するまで辛抱強く待機します。

一方、子プロセスは同じファイル記述子にリンクされています また、グローバルスコープで宣言された変数を共有する場合があります。

子プロセスは「exec」を実行します 」コマンドを実行して、実行しようとしているコマンドのプロセスイメージ内の現在のプロセスイメージ(シェルプロセスイメージ)を置き換えます。

子プロセスは最終的に終了し、その結果を親プロセス(この場合はシェルコンソール自体)から継承した標準出力に出力します。

Linux環境でプロセスを作成する方法についての基本を理解したところで、プロセスの詳細と、プロセスを簡単に識別できる方法を見てみましょう。

Linuxで実行中のプロセスを特定する

Linuxで実行中のプロセスを特定する最も簡単な方法は、 psを実行することです。 コマンド。

$ ps

デフォルトでは、psコマンドは、現在のユーザーが所有する現在実行中のプロセスのリストを表示します。

この場合、私のユーザーに対して実行されているプロセスは2つだけです:bashインタープリター およびpsコマンド 私はそれに遭遇しました。

ここで重要なのは、プロセスには所有者がいるということです。 、ほとんどの場合、そもそもそれらを実行するユーザー。

これを説明するために、Linuxオペレーティングシステムの最初の10個のプロセスを、異なる表示形式でリストしてみましょう。

$ ps -ef | head -n 10

ここに表示されているように、上位10個のプロセスはユーザー「 root」が所有しています。 「。

この情報は、信号を使用してプロセスと対話する場合に特に重要になります。

現在接続しているユーザーが所有および実行しているプロセスを表示するには、次のコマンドを実行します

$ ps u

psコマンドにはさまざまなオプションがあり、手動コマンドを実行すると表示されます。

$ man ps

経験から、実行中のプロセスを確認するための2つの最も重要なコマンドは次のとおりです

ps aux

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

これはBSDスタイルのプロセスリストに対応します 、ここで、次のコマンド

ps -ef

UID  PID  PPID C STIME TTY  TIME CMD

POSIXスタイルのプロセスリストに対応します 。

どちらもシステムで現在実行中のプロセスを表していますが、最初のプロセスには「ユーザー指向」の「u」オプションがあり、プロセスメトリックを読みやすくなっています。

プロセスとは何か、どのようにリストできるかを確認したので、ホスト上にあるバックグラウンドプロセスとフォアグラウンドプロセスを見てみましょう。

バックグラウンドおよびフォアグラウンドプロセス

バックグラウンドプロセスとフォアグラウンドプロセスの定義は、かなり自明です。

現在のシェルのジョブとプロセス

Linuxのバックグラウンドプロセスはバックグラウンドで実行されるプロセスです。つまり、たとえばシェルを介してユーザーがアクティブに管理することはありません。

反対に、フォアグラウンドプロセスは、ユーザーが直接入力することで操作できるプロセスです。

たとえば、シェルターミナルを開いて、コンソールに次のコマンドを入力したとします。

$ sleep 10000

お気づきかもしれませんが、スリーププロセスが終了するまで端末はハングします。結果として、プロセスはバックグラウンドで実行されず、フォアグラウンドで実行されます。

私はそれと対話することができます。 Ctrl + Zを押すと、たとえばプロセスに直接停止信号が送信されます。

ただし、プロセスをバックグラウンドで実行する方法があります。

バックグラウンドでプロセスを実行するには、「」を入力するだけです。 コマンドの最後に「」記号を付けます。

$ sleep 10000 &

ご覧のとおり、コントロールはユーザーに直接戻され、プロセスはバックグラウンドで実行を開始しました

プロセスが実行されていることを確認するには、現在のシェルのコンテキストで、jobsコマンドを実行できます

$ jobs

ジョブは、現在のシェルのコンテキストで開始され、バックグラウンドで実行されている可能性のあるプロセスのリストです。

上記の例でわかるように、現在2つのプロセスがバックグラウンドで実行されています。

左から右への異なる列は、ジョブID、プロセス状態を表します (次のセクションでわかります)、および実行されたコマンド。

bgおよびfgコマンドの使用

ジョブを操作するには、次の2つのコマンドを使用できます: bg およびfg

Linuxでは、プロセスをバックグラウンドに送信するためにbgコマンドが使用されます 構文は次のとおりです

$ bg %<job_id>

同様に、プロセスをフォアグラウンドに送信するには、 fgを使用できます。 同じように

$ fg %<job_id>

前の例のジョブのリストに戻ると、ジョブ3をフォアグラウンド、つまり現在のシェルウィンドウに移動する場合は、次のコマンドを実行します

$ fg %3

Ctrl + Zコマンドを発行することで、プロセスを停止できます。バックグラウンドに送信するために、bgコマンドでリンクできます。

バックグラウンドプロセスとフォアグラウンドプロセスについて理解が深まったところで、シグナルを使用してプロセスを操作する方法を見てみましょう。

信号を使用したプロセスとの対話

Linuxでは、シグナルはプロセス間通信の一形態です。 ( IPCとも呼ばれます )特定のイベントの発生に関する非同期通知を作成して実行中のプロセスに送信します。

シグナルは、キルを送信するためによく使用されます または終了コマンド プロセスをシャットダウンするためにプロセスに送信します(killシグナルとも呼ばれます)。

プロセスにシグナルを送信するには、キルを使用する必要があります コマンド。

$ kill -<signal number> <pid>|<process_name>

たとえば、HTTPDプロセス(PID =123)を(クリーンシャットダウンなしで)強制的に終了するには、次のコマンドを実行します

$ kill -9 123

信号カテゴリの説明

説明したように、特定のプロセスに通知するために送信できる信号はたくさんあります。

最も一般的に使用されるもののリストは次のとおりです:

  • SIGINT :信号割り込みの略は、実行中のプロセスを中断するために使用される信号です。これは、ユーザーが端末でCtrl+Cを押したときに送信される信号でもあります。
  • SIGHUP :Signal hangupの略は、端末が閉じているときに端末から送信される信号です。 SIGINTと同様に、プロセスは終了します。
  • SIGKILL :プロセスを正常に停止できるかどうかに関係なく、プロセスを強制的に停止するために使用される信号。このシグナルは、initプロセス(または最近のディストリビューションではsystemdプロセス)を除いて無視できません。
  • SIGQUIT :ユーザーが現在のプロセスを終了または終了するときに送信される特定の信号。 Ctrl + Dを押すことで呼び出すことができ、ターミナルシェルやSSHセッションでよく使用されます。
  • SIGUSR1、SIGUSR2 :これらの信号は純粋に通信目的で使用され、カスタムハンドラーを実装するためにプログラムで使用できます。
  • SIGSTOP :プロセスを終了せずに実行を停止するようにプロセスに指示します。その後、プロセスは続行されるか、完全に強制終了されるのを待っています。
  • SIGCONT :プロセスが停止済みとしてマークされている場合、プロセスに実行を再開するように指示します。

使用可能なすべての信号の完全なリストを表示するには、次のコマンドを実行できます

$ kill -l

 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     16) SIGSTKFLT
17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU
25) SIGXFSZ     26) SIGVTALRM   27) SIGPROF     28) SIGWINCH
29) SIGIO       30) SIGPWR      31) SIGSYS      34) SIGRTMIN
35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4
39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10
55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6
59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX

信号とプロセスの状態

プロセスを中断、強制終了、または停止できることがわかったので、次はプロセスの状態について学習します。

プロセスにはさまざまな状態があり、次のようになります:

  • 実行中 :実行中のプロセスは、現在の時間にある程度の計算能力(CPU時間など)を使用しているプロセスです。プロセスは、すべての実行条件が満たされ、CPUスケジューラーによって一定のCPU時間を待機している場合、「実行可能」と呼ばれることもあります。
  • 停止 :信号が停止すると、SIGSTOP信号またはCtrl+Zキーボードショートカットにリンクされます。プロセスの実行は一時停止され、SIGCONTまたはSIGKILLを待機しています。
  • 睡眠 :スリーププロセスは、何らかのイベントまたはリソース(ディスクなど)が使用可能になるのを待機しているプロセスです。

これは、送信する可能性のある信号にリンクされたさまざまなプロセス状態を表す図です。

プロセスの状態についてもう少し理解できたので、pgrepコマンドとpkillコマンドを見てみましょう。

pgrepとpkillを使用したプロセスの操作

Linuxでは、psコマンドを使用するだけでできることがすでにたくさんあります。

検索を特定の1つのプロセスに絞り込むことができ、PIDを使用して完全に強制終了することができます。

ただし、コマンドをさらに短くするために設計された2つのコマンドがあります。pgrepとpkill

pgrepコマンドの使用

pgrep commandは、grepコマンドと一緒にパイプされたpsコマンドを使用するためのショートカットです。

pgrepコマンドは、名前または定義されたパターンを使用して、特定のプロセスのすべてのオカレンスを検索します。

pgrepコマンドの構文は次のとおりです

$ pgrep <options> <pattern>

たとえば、ホストで「bash」という名前のすべてのプロセスを検索する場合は、次のコマンドを実行します

$ pgrep bash

pgrepコマンドは、デフォルトで現在のユーザーが所有するプロセスに制限されていません。

別のユーザーがbashコマンドを実行すると、pgrepコマンドの出力に表示されます。

グロビング文字を使用してプロセスを検索することもできます。

pkillコマンドの使用

一方、pkillコマンドは、killコマンドで使用されるpsコマンドのショートカットでもあります。

pkillコマンドは、IDまたは名前に基づいてプロセスにシグナルを送信するために使用されます。

pkillコマンドの構文は次のとおりです

$ pkill <options> <pattern>

たとえば、ホスト上のすべてのFirefoxウィンドウを強制終了する場合は、次のコマンドを実行します

$ pkill firefox

pgrepコマンドと同様に、-uオプションを使用してユーザーを指定することにより、結果を絞り込むオプションがあります。

「fire」で始まり、現在のユーザーとrootが所有するすべてのプロセスを強制終了するには、次のコマンドを実行します

$ pkill user,root fire*

プロセスを停止する権限がない場合は、標準出力にアクセス許可が拒否されたというエラーメッセージが表示されます。

pkillコマンドで信号番号を指定して特定の信号を送信するオプションもあります

たとえば、SIGSTOP信号でFirefoxを停止するには、次のコマンドを実行します

$ pkill -19 firefox

niceとreniceを使用してプロセスの優先度を調整する

Linuxでは、CPU時間に関して、すべてのプロセスに同じ優先順位が与えられるわけではありません。

ルートによって実行される非常に重要なプロセスなどの一部のプロセスには、オペレーティングシステムがシステムにとって本当に重要なタスクを実行するために、より高い優先度が与えられます。

Linuxでのプロセスの優先度はniceレベルと呼ばれます。

良いレベルは、-20から19までの優先度スケールです。

優しさの尺度が低いほど、優先順位は高くなります。

同様に、優しさの尺度が高いほど、優先度は低くなります。

それを覚えておくために、「あなたが優れているほど、他の人とリソースを共有することをいとわない」という事実を思い出すことができます。

特定のプログラムまたはプロセスを特定の適切なレベルで開始するには、次のコマンドを実行します

$ nice -n <level> <command>

たとえば、カスタムtarレベルでtarコマンドを実行するには、次のコマンドを実行します

$ nice -n 19 tar -cvf test.tar file

同様に、reniceコマンドを使用して、実行中のプロセスの適切なレベルを特定の値に設定できます。

$ renice -n <priority> <pid>

たとえば、PID 123で実行中のプロセスがある場合、reniceコマンドを使用して、その優先度を特定の値に設定できます。

$ renice -n 18 123

素晴らしさと許可

sudoグループのメンバー(またはRed Hatベースのディストリビューションのwheelグループのメンバー)でない場合、niceコマンドでできることに関していくつかの制限があります。

説明のために、sudo以外のユーザーとして次のコマンドを実行してみてください

$ nice -n -1 tar -cvf test.tar file

nice: cannot set niceness: Permission denied

優しさに関しては、知っておく必要のあるルールが1つあります:

非root(またはsudo)ユーザーとして、デフォルトで割り当てられたレベル(ゼロ)よりも低いレベルを設定することはできず、実行中のプロセスを現在のレベルよりも低いレベルです。

最後のポイントを説明するために、適切な値2を使用してバックグラウンドでsleepコマンドを起動します。

$ nice -n 2 sleep 10000 &

次に、作成したプロセスのプロセスIDを特定します。

次に、プロセスの適切なレベルを、最初に指定した値よりも低い値に設定してみてください。

$ renice -n 1 8363

お気づきかもしれませんが、ニースレベルを1に設定することはできませんが、指定した値よりも高い値に設定する必要があります。

これで、コマンドをsudoとして実行することを選択した場合、niceレベルをより低い値に設定できるようになります。

niceコマンドとreniceコマンドについて明確に理解できたので、Linuxでプロセスをリアルタイムで監視する方法を見てみましょう。

topとhtopを使用したLinuxでのプロセスの監視

前回の記事では、Linuxプロセスをリアルタイムで監視するために、完全な監視パイプラインを構築する方法について説明しました。

Linuxでtopを使用する

Topは、Linuxホストで実行されているすべてのプロセスの完全で順序付けられたリストを取得するために、すべてのユーザーが実行できるインタラクティブなコマンドです。

topを実行するには、引数なしで実行するだけです。

Topはインタラクティブモードで実行されます。

$ top

カスタムの反復回数でtopを実行する場合は、次のコマンドを実行します

$ top -n <number>

topコマンドは、最初に、実行中のタスクの数、使用されているCPUの割合、メモリ消費量など、システムに関する要約統計を一番上に表示します。

そのすぐ下で、ホスト上で実行中またはスリープ中のすべてのプロセスのライブリストにアクセスできます。

このビューは3秒ごとに更新されますが、明らかにこのパラメーターを微調整できます。

topコマンドでリフレッシュレートを上げるには、「d」コマンドを押して新しいリフレッシュレートを選択します

同様に、キーボードの「r」キーを押すことで、実行中のプロセスの適切な値をライブで変更できます。

プロセスをすでに割り当てられている値よりも低い値に変更する場合も、同じ権限ルールが適用されます。

結果として、コマンドをsudoとして実行する必要がある場合があります。

Linuxでのhtopの使用

または、Linuxホスト上のプロセスを視覚化するためのより良い方法を探している場合は、htopコマンドを使用できます。

デフォルトでは、htopコマンドはほとんどのディストリビューションで使用できないため、次の手順でインストールする必要があります。

$ sudo apt-get update
$ sudo apt-get install htop

Red Hatベースのディストリビューションを実行している場合は、次のコマンドを実行します。

$ sudo yum -y install epel-release
$ sudo yum -y update
$ sudo yum -y install htop

最後に、htopコマンドを実行するには、引数なしで実行するだけです。

$ htop

ご覧のとおり、出力は非常によく似ていますが、より人間にわかりやすい出力で情報が表示される点が異なります。

結論

このチュートリアルでは、プロセスに関する多くの概念を学びました。プロセスの作成方法、管理方法、効果的な監視方法です。

Linuxシステム管理に関連するチュートリアルをさらに探している場合は、Webサイトに専用の完全なセクションがあるので、必ずチェックしてください。


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

  2. Linux の孤立したプロセスを見つける

  3. 基本的な Linux コマンドを理解する

  1. CでのLinuxソフトウェアライブラリを理解するためのガイド

  2. Linuxでの起動時にsystemdを理解する

  3. straceを使用したLinuxでのシステムコールの理解

  1. Linux – Linuxでの同期コマンド操作を理解していますか?

  2. Linuxpsコマンド

  3. Linux SCSI 予約について