UNIXの命令が実行される場合3つの標準的な入出力装置が使われます。特に 指定しなければもちろん入力はキーボードで、出力は標準出力とエラー出力の ふたつがスクリーンに割り当てられます。場合によっては命令の出力をファイ ルに残したいことがあります。このときは出力をリダイレクトします。>を使っ て、
% ls /bin > filelist
%
この場合は標準出力はスクリーンではなくてfilelistという名前のファイル が作られそこに書き込まれます。さらにfilelistに追加して書き込みたいとき は
% ls /usr/bin >> filelist
%
この場合filelistというファイルが存在すればそれに標準出力が追加されま す。同様に入力もリダイレクトができます。この時の文字は<です。lprという 命令を引き数無しで使うと標準入力をプリンターに出力してくれます。
% lpr < filelist
%
ただしこれは% lpr filelistとやるのと効果は同じです。以上の例は入出 力のリダイレクトでしたが、ある命令の標準出力を別の命令の標準入力に直接 つなぐことができます。文字|はその左側の命令の標準出力をその右側の命令 の標準入力として使うことを指定します。これをパイプと呼びます。
% ls /bin /usr/bin | lpr
この場合中間的なファイルは作られずふたつの命令lsとlprが同時に起動さ れます。マルチタスクシステムですからこういうことができるわけです。 (MSDOSのパイプ|は中間ファイルをつくります。シングルタスクだからです。)
標準入力からデータを読み込み加工して標準出力に書き出すだけのプログラ ムがたくさんあります。それらをフィルタープログラムと呼びます。例えば
% cat README | jistosj | lpr
JISコードで書かれた日本語のファイルREADMEを、シフトJISコードしか受け 付けないプリンターに打ち出すためにjistosjというフィルターを使っていま す。ここでcat命令を使いました。catはファイルの内容を標準出力に連鎖する (concatenate)命令で通常はファイルの中身をスクリーンに表示するVMSやDOS のTYPEと同じ意味で使われます。
プロセス
パイプの所でマルチタスクについて少し触れました。UNIXの場合命令を実行
するということは命令を実行するプログラムを一つのプロセスとしてシェルプ
ログラムが生成起動するということです。通常は命令が実行されている間キー
ボードやスクリーンへの入出力は命令実行プログラムが占有して、シェルは休
んでいます。キーボードを占有しているプロセスをフォアグラウンドプロセス
と呼びます。例えばスクリーンのどこかに時刻を表示する命令clockがあった
とします。このプロセスはキーボード入力を必要としませんが、走らせておく
と便利です。このような時にはバックグラウンドで走らせることができます。
(実際にはSUNではclock、ほかのXウインドウシステムではxclockやoclockな
ど)
% clock &
%
このプロセスはキーボードを占有しないバックグラウンドプロセスですから すぐに%が表示されますが、時計は表示されたまま時を刻んで行きます。命令 の後に&をつけると、その命令をバックグラウンドとして走らせるようにとの 意味です。うっかりしてこのclockを&無しで走らせてしまいました。このとき clockはフォアグラウンドとなりキーボードを占有してしまいます。
% clock
こういうときはコントロールキーを押しながらyを押します。(以下ctrl+yと 書きます。)clockプロセスは中断され、
^Y
Stopped
%
プロンプト
% jobs
[1] + Stopped clock
%
このプロセスをバックグラウンドに切り替えます。bgコマンドを使います。 clockプロセスには1というジョブ番号が割り振られています。コマンド文字列 の中で%1はジョブ番号1番のプロセスを表します。
% bg %1
[1] clock &
% jobs
[1] Running clock
%
必要がなくなって止めたいときはkillします。
% kill %1
先程ctrl+yの例が出てきましたが、シェルにはいくつかのエスケープキーが 定義されています。ある命令を実行中に
ctrl+c フォアグラウンドの強制終了。
ctrl+d 入力の終了。%に対しこのキーを押すとシェルが終わってしまう。
ctrl+y フォアグラウンドの強制中断。
ctrl+z 入力の中断。
によってシェルを呼び出すことができます。
jobsでは自分が現在ログインしている端末から実行したプロセスが表示され ます。実際にはそれ以外にも様々なプロセスが走っています。psはそれらを表 示するコマンドです。process statusです。psではジョブ番号の替わりにpid (プロセスID)でプロセスが識別されています。何かの事情で走りっぱなしになっ ているプロセスができてもjobsで見ることができないことがあります。別のロ グインセッションで起動されたプロセスなどはそうなります。それらを止めた いときはpsで見てpidを確かめ、killでジョブ番号の替わりにpidそ のものを(
% ps x
PID TT STAT TIME COMMAND
19350 co IW 0:00 -csh (csh)
19469 co S 0:03 clock
19530 co R 0:00 ps
% kill 19469
%
psではオプションを表す-は省略できます。この例の中のxは-xと同じです。バッ クグラウンドで走っているプロセスも表示させるスイッチです。いらなくなっ たclockをkillします。
UNIXの場合でもプロセスの実行優先度は設定されます。ps lでプロセスの詳 細を見てみましょう。
% ps l
F UID PID PPID CP PRI NI SZ RSS WCHAN STAT TT TIME COMMAND
20008201 100 21453 21449 1 15 0 88 328 kernelma S p0 0:00 -bin/csh
20000001 100 21514 21453 20 30 0 184 416 R p0 0:00 ps l
色々なデータが表示されていますが、優先度に関係するのはCP、PRIとNIです。 UNIXは非常に平等なシステムなのですべてのプロセスが同じだけCPUにありつ けるように優先度を計算します。CPは最近のCPU利用率でこれが多いと優先度 を下げられます。PRIが実際の優先度を表します。これだけでは困ることもあ ります。UNIXの場合はバッチジョブの概念がありません。CPUは食うけれども 時間がかかっても構わないプロセスはユーザが自分で優先度を下げる責任があ ります。そうでないとそのプロセスも一人前の顔をしてCPUを要求してきます。 そうすると端末の応答が悪くなったりして人に迷惑をかけることになります。 意識的に優先度を下げるのがniceです。NIがその値で、この数値は大きければ 大きいほど優先度を下げます。自分自身のナイス値を増やすには
% nice +3
とやります。ナイス値は0から19までの値を取ることが出来ます。あるコマン ドを特定のナイス値で実行するには
% nice +5 ps l
この場合ps lがナイス値5で実行されます。実際にやってみてどこが変わった か見つけてみましょう。自分ののナイス値より小さい値をバックグラウンドプ ロセスに設定することは出来ません。一旦増やしたナイス値を減らすことも出 来ません。