Previous | Contents | Next
前回のレッスンでは、LinuxがマルチユーザーOSであることの意味をいくつか見てきました。 このレッスンでは、Linuxのマルチタスクの性質と、それがコマンドラインインターフェースでどのように制御されるかを調べます。
他のマルチタスクOSと同様に、Linuxは複数の同時プロセスを実行します。 まあ、とにかく同時進行しているように見えるのです。 実際、1つのプロセッサ・コアは一度に1つのプロセスしか実行できないが、Linuxカーネルは各プロセスにプロセッサでの順番を与え、それぞれが同時に実行されているように見えるように管理する。 それらは
-
ps
– システム上で動作しているプロセスをリストアップ -
kill
– 一つ以上のプロセスに信号を送る (通常プロセスを “kill” する) -
jobs
– 自分のプロセスのリストを作る別の方法 -
bg
– プロセスを制御するために使われるいくつかのコマンドがある。 プロセスをバックグラウンドにする -
fg
– プロセスをフォアグラウンドにする
A Practical Example
このテーマはかなり曖昧に見えるかもしれません。 グラフィカル・ユーザー・インターフェースで作業する平均的なユーザーにとっては、非常に実用的なものです。 あまり知られていないかもしれませんが、ほとんどの(すべてではないにしても)グラフィカル・プログラムは、コマンドラインから起動することができます。 例えば、X Windowシステムに付属するxloadという小さなプログラムがありますが、これはシステム負荷を表すグラフを表示します。
xload
小さなxload
ウィンドウが表示され、システム負荷グラフを表示し始めることに注意してください。 xload
が利用できないシステムでは、代わりにgedit
を試してみてください。 プログラムが起動した後、プロンプトが再表示されないことにも注目してほしい。 シェルはプログラムが終了するのを待ってから制御を戻しているのである。 xload
ウィンドウを閉じると、xload プログラムは終了し、プロンプトが戻ります。
Putting a Program into the Background
さて、生活を少し楽にするために、xload プログラムをもう一度起動しますが、今度はプロンプトが戻るようにバックグランドに配置します。
xload &
1223$この場合、プロセスがバックグラウンドに置かれたため、プロンプトが返されます。
ここで、プログラムをバックグラウンドに置くために「&」記号を使うのを忘れたと想像してください。 まだ希望はある。 Ctrl-z
と入力すれば、プロセスは中断されます。 プログラムのウィンドウがフリーズしていることを確認すれば、このことがわかります。 プロセスはまだ存在するが、アイドル状態である。 バックグラウンドでプロセスを再開するには、bg
コマンド(backgroundの略)を入力する。 以下はその例です。
xload
+ Stopped xload$ bg
+ xload &Listing Running Processes
さて、バックグラウンドでプロセスを持っているので、起動したプロセスのリストを表示すると便利でしょう。 これを行うには、jobs
コマンドまたはより強力な ps コマンドのいずれかを使用します。
jobs
+ Running xload&$ ps
PID TTY TIME CMD1211 pts/4 00:00:00 bash1246 pts/4 00:00:00 xload1247 pts/4 00:00:00 ps$プロセスの終了
応答しなくなったプログラムがあるとします。 もちろん、kill
コマンドを使用します。 試しにxload
でやってみましょう。 まず、終了させたいプロセスを特定する必要があります。 これには、jobs
または ps
のいずれかを使用します。 jobs を使用すると、ジョブ番号が返されます。 ps
を使用すると、プロセス ID (PID) が返されます。 私たちは、bothways:
xload &
1292$ jobs
+ Running xload&$ kill %1
$ xload &
1293 Terminated xload$ ps
PID TTY TIME CMD1280 pts/5 00:00:00 bash1293 pts/5 00:00:00 xload1294 pts/5 00.00:00 xload1294 pts/5 00:00:00 ps$ kill 1293
+ 終了 xload$A Little More About kill
kill
コマンドはプロセスを「殺す」ために使われますが、その本当の目的はプロセスにシグナルを送ることにあります。 ほとんどの場合、シグナルはプロセスに立ち去るよう指示するものだが、それ以上のことがある。 プログラムは(適切に記述されていれば)オペレーティング・システムからのシグナルを聞き、それに応答します。 例えば、テキストエディタは、ユーザーがログオフしていること、あるいはコンピュータがシャットダウンしていることを示すあらゆるシグナルを聞き取ることができます。 このシグナルを受信したら、終了する前に進行中の作業を保存することができます。 kill
コマンドは、プロセスにさまざまなシグナルを送信することができます。
kill -l
と入力すると、サポートしているシグナルのリストが表示されます。 多くはあまり知られていないが、いくつか知っておくと便利なものがある:
Signal # | Name | Description |
1 | SIGHUP | Hang up signal (電話を切るシグナル). プログラムはこのシグナルをリッスンし、それに応じて動作することができる。 このシグナルは、ターミナルを閉じたときに、ターミナルで動作しているプロセスに送られる。 |
2 | SIGINT | インタラプト信号。 この信号は、プロセスに割り込みをかけるために与えられる。 プログラムはこのシグナルを処理し、それに基づいて行動することができる。 また、プログラムが動作している端末ウィンドウでCtrl-c と入力することで、このシグナルを直接発行することもできる。 |
15 | SIGTERM | 終了シグナル。 この信号はプロセスを終了させるために与えられる。 この場合も、プログラムはこのシグナルを処理して動作させることができる。 これは、シグナルが指定されていない場合に kill コマンドが送るデフォルトのシグナルである。 |
9 | SIGKILL | Kill シグナル。 このシグナルは、Linux カーネルによってプロセスが即座に終了させられる。 プログラムはこのシグナルをリッスンできない。 |
さて、絶望的にハングアップしたプログラムがあり、それを取り除きたいとする。
-
ps
コマンドを使用して、終了させたいプロセスのプロセスID (PID) を取得する。
ps x | grep bad_program
PID TTY STAT TIME COMMAND2931 pts/5 SN 0:00 bad_program$ kill -SIGTERM 2931
$ kill -SIGKILL 2931
上記の例では、x オプション付きの ps
コマンドを使ってすべてのプロセス (現在のターミナルから起動しないものも) を一覧表示しています。) さらに、ps コマンドの出力を grep
にパイプし、関心のあるプログラムのみをリストアップしています。 次に、kill を使用して、問題のあるプログラムに対して SIGTERM シグナルを発行しました。
kill 2931
そして、プロセスが終了しない場合は、SIGKILLシグナルで強制終了させます:
kill -9 2931
以上
これで「シェルを学ぶ」シリーズのレッスンは終了です。 次回の「シェルスクリプトの書き方」では、シェルを使ってタスクを自動化する方法について見ていきます。 Computer History Museum による、最初のタイムシェアリング オペレーティング システムとその仕組みを説明した魅力的な YouTube ビデオです。 これは基本的に、現代のすべてのコンピュータで使われているのと同じ方法です。