プロセス管理とシェルスクリプトの基礎
killの既定シグナルはSIGTERM(15)でありSIGKILL(9)ではない。シグナル番号の対応、jobs/fg/bg/nohupによるジョブ制御、$?・$#等の特殊変数とfi/esac等の終端キーワードの対応が本章の得点源である。
本章では、Linuxの動作の根幹であるプロセス管理と、運用自動化の第一歩となるシェルスクリプトの基礎を扱う。LinuCレベル1の公式出題範囲(Version 10.0)では、プロセス管理は101試験の副主題1.01.4「プロセスの生成、監視、終了」(重要度3)に位置づけられる。シェルスクリプトの文法自体は102試験側の副主題1.06.2「シェルスクリプト」(重要度6)で本格的に問われるが、101試験でも副主題1.03.1「コマンドラインの操作」(重要度4)でシェル変数・環境変数・引用符の扱いが問われるため、本章で一体として基礎を固めておく。プロセスとは実行中のプログラムの実体であり、カーネルから一意のプロセスID(PID)を割り当てられる。すべてのプロセスは親プロセスから生成され、親のPIDはPPIDとして参照される。システム起動時に最初に起動するPID 1のプロセス(主要ディストリビューションではsystemd)が全プロセスの祖先である。プロセス情報はカーネルが/procファイルシステムを通じて公開しており、psやtopはこれを読み取って表示している。
プロセスの監視には複数のコマンドを使い分ける。psはその時点のプロセス一覧を表示するコマンドで、ハイフンなしのBSD形式とハイフン付きのUNIX(System V)形式の2系統のオプションがある点が頻出である。全ユーザーのプロセスを詳細表示する「ps aux」と「ps -ef」はほぼ同じ目的で使われ、auxのaは端末を持つ他ユーザーのプロセスも含める、uはユーザー名付きの詳細表示、xは制御端末を持たないプロセスも含める、という意味である。pstreeはプロセスの親子関係をツリー状に表示し、-pオプションでPIDを併記する。topはCPU使用率やメモリ使用量をリアルタイムに更新表示し、uptimeはシステムの稼働時間とロードアベレージ(直近1分・5分・15分の実行待ちプロセス数の平均)を表示する。pgrepはプロセス名やユーザーなどの条件に合致するPIDを検索して表示するコマンドで、「pgrep -u root sshd」のような形式で用いる。いずれも副主題1.01.4に明記されたコマンドである。
シェルにはジョブ制御の機能があり、コマンド末尾に「&」を付けるとバックグラウンドで実行される。ジョブの一覧はjobsで確認し、「fg %ジョブ番号」でフォアグラウンドへ切り替え、「bg %ジョブ番号」で停止中のジョブをバックグラウンドで再開できる。フォアグラウンドのプロセスはCtrl+ZでSIGTSTPが送られて一時停止し、Ctrl+CでSIGINTが送られて中断される。端末からログアウトするとシェルの子プロセスにはSIGHUPが送られ通常は終了するが、「nohup コマンド &」で起動すればSIGHUPを無視してログアウト後も実行を継続でき、このとき標準出力は既定でnohup.outに書き込まれる。また、screenやtmuxといった端末多重化ソフトウェアを使えば、セッションを切断(デタッチ)しても処理は継続し、後から再接続(アタッチ)して作業を再開できる。これらはすべて副主題1.01.4の「ログアウト後もプログラムの実行を継続する」として明記された頻出論点である。
プロセスの終了にはシグナルを用いる。シグナルはプロセスへの非同期の通知であり、killコマンドは「kill [-シグナル] PID」の書式で任意のシグナルを送信する。本試験ではシグナル番号と名前の対応が直接問われる。主要なものは、1=SIGHUP(端末切断。デーモンには設定再読み込みの慣習)、2=SIGINT(Ctrl+Cによる割り込み)、9=SIGKILL(強制終了。プロセス側で捕捉も無視もできない)、15=SIGTERM(終了要求。killの既定シグナル)、18=SIGCONT(停止プロセスの再開)、19=SIGSTOP(停止。捕捉不可)である(番号はLinux x86_64環境の場合)。シグナル指定を省略したkillが送るのはSIGKILLではなくSIGTERMである点が最大のひっかけどころである。プロセス名を指定してまとめてシグナルを送るコマンドとして、名前の完全一致で送るkillallと、パターンやユーザー等の属性で対象を絞れるpkillがあり、検索専用のpgrepと対で覚える。シグナルの一覧は「kill -l」で確認できる。
シェルスクリプトは、1行目にシバン(#!/bin/bash)を書いて実行するインタプリタを指定し、chmodで実行権を付与すれば「./script.sh」として実行できる(実行権の管理は副主題1.06.2にchmod・chownとして明記)。実行方法の違いは頻出で、「bash script.sh」や「./script.sh」は新しいサブシェルを生成して実行するため、スクリプト内で定義した変数は終了後の呼び出し元シェルに残らない。一方、sourceコマンド(同義の「.」)はカレントシェル上でファイルを読み込んで実行するため、変数や関数の定義がそのまま現在のシェルに反映される。設定変更を反映する「source ~/.bashrc」が典型例である(sourceは副主題1.06.1「シェル環境のカスタマイズ」に明記)。変数は「変数名=値」で代入し、=の前後に空白を入れてはならない。exportした変数は環境変数として子プロセスに引き継がれる。引数は位置パラメータ$1〜$nで受け取り、$0はスクリプト名、$#は引数の個数、$@と$*は全引数を表し、shiftは位置パラメータを左へ1つずらす。直前のコマンドの終了ステータスは$?で参照でき、0が正常終了、0以外が異常を意味する。exitで任意の終了ステータスを返せる。
制御構造では、if文はtestコマンド(角括弧[ ]と同義)の終了ステータスで分岐し、if〜then〜elif〜else〜fiの形をとる。testの演算子は、ファイル判定の-e(存在)、-f(通常ファイル)、-d(ディレクトリ)、数値比較の-eq・-ne・-lt・-gt、文字列比較の=・!=・-z(空文字列)が代表的である。case文は「case 変数 in パターン) 処理 ;; esac」の形で多分岐を記述し、終端キーワードがesacである点(ifの終端はfi、for/whileの終端はdone)が問われる。繰り返しはfor文とwhile文で記述し、処理のまとまりはfunctionで関数として定義できる。ユーザー入力はreadで変数に受け取る。デバッグには、実行される各コマンドを変数展開後の形で表示しながら実行する「bash -x」と、読み込んだ行をそのまま表示する「bash -v」があり、いずれも副主題1.06.2に明記されている。CBT方式の本試験ではキーワードの対応関係や特殊変数の意味を問う一問一答形式が中心のため、実機で手を動かしながら正確に暗記することが合格への近道である。
この章の問題から3問
killコマンドをシグナル指定なしで「kill 1234」のように実行した場合、PID 1234のプロセスにはSIGKILL(シグナル番号9)が送信される。
正解 ×(誤り)
誤り。killの既定シグナルはSIGTERM(15)であり、SIGKILL(9)を送るには「kill -9 1234」や「kill -KILL 1234」と明示する必要がある。「kill=強制終了=SIGKILL」という連想を突くひっかけで、SIGKILLは捕捉・無視できない強制終了、SIGTERMは終了要求という違いも併せて問われる。根拠: LinuCレベル1 101試験範囲(Version 10.0)副主題1.01.4「プロセスの生成、監視、終了」、kill(1)マニュアル。
「nohup コマンド &」の形式で起動したプロセスは、端末からログアウトしてSIGHUPが送られる状況でも実行を継続する。
正解 ○(正しい)
正しい。nohupはSIGHUP(端末切断シグナル)を無視させてコマンドを起動するため、ログアウト後も処理が継続し、標準出力は既定でnohup.outに書き込まれる。同じ目的でscreenやtmuxによるデタッチ/アタッチも副主題1.01.4に明記されている。根拠: LinuCレベル1 101試験範囲(Version 10.0)副主題1.01.4、nohup(1)マニュアル。
シェルスクリプトをsourceコマンド(または「.」)で実行すると新しいサブシェルが生成されるため、スクリプト内で定義した変数は実行後のシェルには残らない。
正解 ×(誤り)
誤り。サブシェルを生成するのは「bash script.sh」や「./script.sh」による実行であり、source(同義の「.」)はカレントシェル上でファイルを読み込んで実行するため、定義した変数や関数はそのまま現在のシェルに残る。だからこそ設定反映に「source ~/.bashrc」が使われる。実行方式を逆にしたひっかけである。根拠: LinuCレベル1 102試験範囲(Version 10.0)副主題1.06.1「シェル環境のカスタマイズ」(source)、bash(1)マニュアル。
登録不要 ・ 採点と解説はその場 ・ 進捗は端末に保存
LinuC レベル1(101試験)の他の章
- Linuxのインストールと仮想マシン・コンテナ
- ファイル・ディレクトリの操作と管理(パーミッション)
- GNUとUnixのコマンド(テキスト処理・パイプ)
- ハードウェアとデバイス・ファイルシステム
- ネットワークの基礎とセキュリティ管理
本ページの講義ノートと問題は、各試験の出題範囲に基づきAIが作成し、法令・基準に照らして別のAIレンズで敵対的に検証したものです(検証プロセス)。法改正等で誤りが見つかった場合は随時修正します。合格を保証するものではありません。