[Litz' UNION] > [Dal Segno] > [UNIXたん] > [その3] // [その2][その4]

UNIXたん その3

マルチタスク

同時に複数の処理をすることです。そういうことです。
UNIXはマルチタスクシステムなので、以下のプロセス・ジョブ制御が重要です。

プロセス

マルチタスクシステムでは同時に複数のプログラムが動作します。
(Terminal しか動かしてないよ、っていう場合もあるんですが)
1つのプログラムは複数の機能からなっています。
それを細かく分けたのがプロセスです。コンピュータの中にはプロセスがイパーイ(・∀・)だね

これらのプロセスを自分で制御できた方が有利なので、プロセス制御を覚えましょう。

全てのプロセスは、何らかのプロセスによって生成されます。
これを親子関係とみて「親プロセス子プロセスを生成する」といいます。

通常、親プロセスを殺すとその子プロセスも死にますが
何らかの理由により親プロセスのみが死んでしまうことがあります。
こうなってしまうと面倒なので、子プロセスが先に死ななければならないということを念頭に置いておきましょう。

ps

実行中のプロセスの情報を表示します。無害

-a オプションを付けると、他ユーザが実行したプロセスも表示します。
-e オプションを付けると、各プロセスの環境変数も表示します。
-j オプションを付けると、プロセスの詳細な情報を表示します。
-l オプションを付けると、プロセスの詳細な情報を表示します。
-m オプションを付けると、メモリ使用量でソートします。
-p #(数) オプションを付けると、指定したプロセスIDの情報を表示します。
-r オプションを付けると、CPU使用量でソートします。
-u オプションを付けると、プロセスの詳細な情報を表示します。
-U **(ユーザ名) オプションを付けると、指定のユーザが実行したプロセスを表示します。
-v オプションを付けると、プロセスの詳細な情報を表示します。

> ps -j
litz 390 389 390 2487c8c 1 S std 0:00.38 -tcsh(tcsh)
左からuser, pid, ppid, pgid, sess, jobc, stat, tt, time, command

> ps -l
501 390 389 0 31 0 5872 896 - S std 0:00.39 -tcsh(tcsh)
左からuid, pid, ppid, cpu, pri, ni, vsz, rss, wchan, stat, tt, time, command

> ps -u
litz 390 0.0 0.1 5872 896 std S 11:01AM 0:00.38 -tcsh(tcsh)
左からuser, pid, %cpu, %mem, vsz, rss, tt, stat, started, time, command

> ps -v
390 S 0:00.39 0 0 0 5872 896 - 0 0.1 0.1 -tcsh(tcsh)
左からpid, stat, time, sl, re, pagein, vsz, rss, lim, tsiz, %cpu, %mem, command

キーワードの意味は次の通り。幾つか重要なもののみ掲載

%cpu … CPU使用率。
%mem … メモリ使用率。
command … コマンド名(引数つき)。
nice … ナイス値。優先順位の計算に使われる。値が小さいほど優先度が高い。
pid … プロセスID。これ重要
pri … プロセスの優先順位。
tt … 端末名。
started … プロセス開始時刻。
stat … プロセスの状態(0:存在しない, S:スリープ, T:停止, Z:ゾンビ, R:動作中)。

top

プロセスの状態をリアルタイムに表示します。無害

プロセス制御

まずはプロセスを作りましょう。
といっても、何かプログラムを実行するだけです。ほらできた
プログラムの実行が終われば、そのプログラムによって生成されたプロセスは消滅します。

UNIXでは同時に複数のプロセスを実行できますが、そのとき
どのプロセスを優先するかというのを設定することができます。
これが nice

プログラムの挙動がおかしくなった場合、当該プロセスにシグナルを送って停止させることができます。
これが kill

nice

優先順位を変更してプログラムを実行します。ほぼ無害

nice -#(数) commandとすると、nice値を#としてコマンドを実行します。
但し#は0〜20の間。小さいほど優先度高。マイナス値はrootしか指定できません。

renice

実行中のプロセスの優先度を変更します。ほぼ無害

renice #(数) ***(プロセスID) とすると、指定したプロセスのnice値を#に変更します。
renice #(数) -u **(ユーザ名) とすると、指定のユーザが実行したプロセスのnice値を全て#に変更します。
root以外は、nice値を減らすことはできません。

> ps -l
UID PID PPID CPU PRI NI VSZ RSS WCHAN STAT TT TIME COMMAND
501 390 389 0 27 4 5872 896 - SN std 0:00.57 -tcsh (tcsh)
501 607 390 0 27 4 1584 424 - SN std 0:00.01 vi

> renice 7 607
607: old priority 4, new priority 7
> ps -l
UID PID PPID CPU PRI NI VSZ RSS WCHAN STAT TT TIME COMMAND
501 390 389 0 27 4 5872 896 - SN std 0:00.59 -tcsh (tcsh)
501 607 390 0 24 7 1584 420 - SN std 0:00.03 vi

kill

プロセス・ジョブを殺します。有害

-l オプションを付けると、シグナル一覧を表示します。
kill -シグナル プロセスID とすると、指定のプロセスにシグナルを送ります。
シグナルを省略した場合のデフォルトはTERM(15)です。
シグナルには名前・番号どちらを指定してもOKです。

以下にシグナル一覧を掲載。9:KILL あたりは結構使いそうだ

(1) HUP … 回線切断。apacheを再起動するのに使うかも
(2) INT … 中断。[Control]+[C]と同じ。
(3) QUIT … 中断終了。[Control]+[\]と同じ。
(9) KILL … 強制終了。
(15) TERM … 終了。シグナルを指定しない場合のデフォルト。
(17) STOP … 強制停止。
(18) TSTP … 一時停止。[Control]+[Z]と同じ。
(19) CONT … 停止状態のプロセスを再開。

nohup

ログアウトしても処理を中断しません。ほぼ無害

nohup **(コマンド) & とすると、ログアウト後もコマンドがバックグラウンドで動き続けます。

ジョブ

ジョブとは、シェルからみた仕事の単位のことで、幾つかのプロセスからなるものです。
プロセスがコンピュータから見た概念であるのに対し、ジョブはユーザから見た概念であるといえます。
例えば ls | less のようなパイプを使った場合、プロセスとしては2つ、ジョブとしては1つのものです。

基本的に、シェルは同時に1つのジョブしか行えません。
emacs と打ってEmacsを起動させると、そのターミナルウィンドウではEmacsを終了させるまで次のコマンドが打てません。
このような、表へ出てキー入力を受けるジョブをフォアグラウンドジョブといいます。
さて、実はバックグラウンドでは多数のジョブを動かすことができます。
このような、バックグラウンドにありキー入力を受け付けないジョブをバックグラウンドジョブといいます。

フォアグラウンドは1つだけ、バックグラウンドは複数OKってこった。

jobs

実行中のジョブを表示します。無害

> jobs
[1]  Suspended   less file1
[2] - Suspended   vi
[3] + Suspended   emacs


左から[ジョブ番号], 状態, コマンドと引数
+ のついてるやつがカレントジョブです。

ジョブ制御

ジョブを生成するには、プログラムを実行するだけです。
コマンドをそのまま与えると、フォアグラウンドジョブとして起動します。
コマンドの最後に & をつけると、バックグラウンドジョブとして起動します。

ls, jobs などの、結果を表示してすぐに終わってしまうようなジョブはフォアグラウンドで起動しようがバックグラウンドで起動しようがすぐに終了します。
それに対してless, bc などの、ユーザからのキー入力を待つようなジョブをバックグラウンドで起動すると、こいつは影で待機し続けています。

[Control]+[Z]とすると、現在のフォアグラウンドジョブを停止状態にします。
例えばviを起動している時にこれをやると、viは停止状態になり(終了しない)、画面はコマンドラインに戻ります。

以下、ジョブの状態を制御するコマンドの解説

fg

ジョブをフォアグラウンドへ移します。無害

単独で実行すると、カレントジョブが操作対象になります。
fg %n(nはジョブ番号) とすると、指定したジョブをフォアグラウンドに移します。

emacs がカレントジョブであった場合、fg を実行すると
emacsがフォアグラウンドに移ります(emacsの編集画面が表示される)。

bg

停止中のジョブをバックグラウンドで動作させます。無害

単独で実行すると、カレントジョブが操作対象になります。
bg %n(nはジョブ番号) とすると、指定したジョブをバックグラウンドで動かします。

stop

バックグラウンドで動作中のジョブを停止させます。無害

stop %n(nはジョブ番号) とすると、指定したバックグラウンドジョブを停止させます。

kill

ジョブを殺します。やや有害

kill %n(nはジョブ番号) とすると、指定したジョブを強制終了させます。

以上をまとめると、次の通り。

フォアグラウンド生成:コマンドを実行
バックグラウンド生成:「コマンド &」を実行
停止状態生成:できない
フォアグラウンド→バックグラウンド:できない
フォアグラウンド→停止状態:[Control]+[Z]
フォアグラウンド→強制終了:[Control]+[C]
バックグラウンド→フォアグラウンド:fg
バックグラウンド→停止状態:stop
バックグラウンド→強制終了:kill
停止状態→フォアグラウンド:fg
停止状態→バックグラウンド:bg
停止状態→強制終了:kill

[Litz' UNION] > [Dal Segno] > [UNIXたん] > [その3] // [その2][その4]