!!!Linux プロセスの作成、監視、強制終了 [Linux][Linux コマンド] {{amazon 487311070X}} !!!プロセス *カーネルは、システムで動作中のプログラムをプロセスとみなす *シェルもプロセス !!プロセスに関連付けられる属性と概念 !生存期間 *プロセスは実行すると生存する !PID(プロセスID) *各プロセスには、開始時に番号が割り当てられる *PIDは、動作中の全プロセスの中で*一意となる整数値 !UID(ユーザーID)とGID(グループID) *プロセスには必ず権限が関連付けられている *UIDとGIDは、プロセスを開始したユーザーに関連付けられる *これにより、プロセスがファイルシステムのどのオブジェクトにアクセスできるかを制限している !親プロセス *システムの起動時にカーネルによって最初に開始されるプロセスは、initというプログラム *initのPIDは1 *すべてのプロセスの最終的な親 !親PID(親プロセスID) *あるプロセスを作成した別のプロセスID !環境 *各プロセスは、変数とそれに関連付けられた値の一覧を保持。 *この一覧をまとめてプロセスの環境と呼ぶ *変数は、環境変数と呼ぶ *環境は親プロセスから継承されるが、機動スクリプトを実行して置き換え可能 !カレントディレクトリ *各プロセスには、デフォルトディレクトリが関連付けられる *デフォルトディレクトリは、ファイルシステムないの他の場所が指定されている場合を除いて、プロセスがファイルを検索したり書き込んだりする場所となる !!!プロセスの監視 *プロセスを管理するためのユーティリティが用意されている !!ps *現在実行中のプロセスのスナップショットを標準出力に生成 !頻用オプション ,オプション,内容 ,-a,他のユーザーが所有し、端末に結びつけられているプロセスも表示 ,-f,フォレストモード。親子関係を表示する場合に使用 ,-l,ロング形式。詳細情報を表示 ,-u,ユーザー形式。ユーザー名や開始時刻 ,-w,ワイド出力形式。出力行を切り捨てるデフォルト設定を無視。-fの場合便利 ,-x,制御端末のないプロセス情報も表示。デーモンなどのプロセスの情報が必要な場合 ,-C cmd,cmdで指定したコマンドのプロセスのみ表示 ,-U usr,usrで指定したユーザーが所有するプロセスを表示 ::使用例 $ ps $ ps -aux $ ps aux $ ps u -C httpd !!pstree *プロセスの一覧をツリー形式で表示 *pidで有効な番号を指定すると、そのプロセスをルートとしてツリーが展開される *pidを指定しない場合、initプロセスがルートとなる *userで有効なユーザー名を指定すると、そのユーザーが所有する全プロセスがツリー形式で表示される !!top *psコマンドに似た結果を出力するが、出力結果が絶えず更新される *プロセスの状態を監視したり、プロセスによるシステムの利 用状況を参照する場合に便利 *デフォルトでは、CPUの使用率が高い順に表示 !使用例 ::オプションを指定しないと、プロセスの詳細な情報が表示され、5秒おきに更新 $ top ::更新速度を早めた状態で実行(1秒に設定する例) $ top -d 1 ::繰り返し画面表示を更新させるには、-d 0 または、-qオプションを指定 $ top -qi ::出力結果をファイルに記録しておきたい場合、-b(バッチ)オプションを使用 *-iオプションで、アイドル状態のプロセスを排除 *-nオプションと引数で、5回抱け繰り返し *-dオプションで、更新間隔を1秒に *出力結果をリダイレクト $ top bin 5 d 1 > file1 !!!実行中のプロセスにシグナルを送る *システムで動作中のプロセスはシグナルの到着を待機している *シグナルとはカーネルまたはユーザーからプロセスに送られる簡単なメッセージ *メッセージの送信にはプロセス間通信が使用される *シグナルは単一の値 *Linuxにはおよそ30個のシグナルが定義されている !!よく使用されるシグナル ,シグナル名,番号,意味 ,HUP,1,ハングアップ。ユーザーがログアウトしたときなどに自動で送られる。デーモンに設定ファイルを再読み込みさせたい場合にも使用できる ,INT,2,割り込みによるドウサの停止。C-Cを押すと送られる ,KILL,9,強制終了。無条件かつ直ちに動作を停止。プロセスがこの信号を蒸しすることはできない ,TERM,15,通常の手段で終了する ,TSTP,18,実行を停止し、再会を待つ。C-Zを押すと送られる !!kill kill [s- sigspec | -sigspec] [pids] *sigspecには、シグナルの値を整数値またはシグナル名(SIGHUPやHUPなど)で指定する *sigspecを指定しないと、SIGTERMを指定したものと解釈される kill -l [signum] *この場合、killは有効なシグナル名を一覧表示する !!!プロセスの終了 *サービスで障害が発生したら、そのサービスの種類に応じてpsまたはtopを使って問題のあるプロセスを特定することができる *問題のあるPIDが分かれば、killコマンドを使ってそのプロセスにSIGTERMシグナルを起こり、素のプロセスを規程の手順で終了することができる !!!シェルのジョブ制御 *Linuxと最新のUnixには、ジョブ制御という機能が用意されている *実行中のコマンドをシェル(カーネルのサポートも必要)がバックグラウンドに配置し、そこで実行を続けること *バックグラウンドで実行している時には、シグナルを送る以外にプロセスの入力が必要ない *プロセスをバックグラウンドで開始する場合には、ジョブを作成する *ジョブには1から順にジョブ番号が割り当てられる ::&をつけてプロセスをバックグラウンドで実行する例 $ netscape & [1] 1748 *コマンドラインからnetscapeを起動し、ブラウザの終了を待たずにシェルが動作しつづけるようにする *[1] はジョブ番号が1であるということ ::&をつけ忘れても、後でバックグラウンドに配置できる例 ^Z [1]+ Stopped netscape $bg [1]+ netscape & *fgコマンドで、再開できる *jobsコマンドでバックグラウンドジョブと状態を表示できる !!bg bg [jobspec] *jobspecで指定したジョブをバックグラウンドに配置する *&文字を指定した起動した場合と同じ *jobspecを指定しないと、カレントジョブが処理対象となる !!fg fg [jobspec] *指定のジョブをフォアグランドに配置して、カレントジョブにする !!jobs jobs [options] [jobspecs] *実行中のジョブを表示する !!!プロセスの実行優先度を変更する *他のタスクよりも多くの実行時間を必要とするようなタスクの実行頻度を上げ、タイムスライスを長くしたい場合に対処するため、各プロセスには優先度が割り当てられている。 *通常はカーネルが自動的に処理する *カーネルは数多くの要因にしたがい、各プロセスの優先度を動的に変更している *要因には、プロセスが消費したシステム時間やプロセスの状態(I/O待ちのプロセスが多い。カーネルが優先するのはこの種のプロセス)などがある *各プロセスの優先度は、topコマンドまたはps -lコマンドの出力結果PRI列を調べれば分かる !!nice *カーネルがプロセスに優先度を割り当てる際に考慮する要因の一つに、ユーザーが提供するナイス値がある *プロセスに優先度を割り当てるには、niceコマンドを使用する *ナイス度をあげるのは、優先度を下げること *デフォルト設定の場合、ユーザープロセスのナイス値は0 *ナイス値は、-20〜+19の範囲 *ナイス値を下げ(優先度を上げ)ることが出きるのは、スーパーユーザーのみ # nice --10 vi /etc/hosts.deny !!renice *target で指定した1つ以上の実行中のプロセスにnicenumberで指定したナイス値を設定して優先度を変更する renice [+|-]nicenumber [option] target