Linuxのバックグラウンドジョブに関するメモです。
バックグラウンド実行のプロセスの一覧表示
jobs
jobs -l
※-l:プロセスIDも表示する
コマンドをバックグラウンドで実行する
コマンド &
フォアグランド実行中のプロセスを一時停止させ、バックグラウンド停止中(Stopped)に切替える
Ctrl+Z
プロセスを、バックグラウンド停止中(Stopped)に切替える (フォアグランド実行中もバックグラウンド実行中も)
kill -STOP PID
※別コンソールからでも実行可。
バックグラウンド停止中(Stopped)のプロセスを、バックグラウンド実行中(Running)に切替える
bg
bg ジョブ番号
kill -CONT PID
※bgコマンドでジョブ番号を省略した場合には、カレント・ジョブ(jobsコマンドで表示される一覧で+のついたジョブ)を対象にする
バックグラウンド中(Stopped, Running)のプロセスをフォアグランドに切替える
fg
fg ジョブ番号
※バックグラウンド中のプロセスは一般的にジョブといいます。しかしこのページではあえて「プロセス」で統一します。
nohup
バックグラウンド中のプロセスは、ターミナルエミュレータを終了したりログアウトすると終了します。これは親プロセスの終了にともない子プロセスも終了させ、ゾンビプロセスの発生を防ぐいわば親切機能です。
実行中のコマンドを間違ってCtrl+Zでバックグラウンドにまわしてしまい、明示的に終了させないままにしてしまうことは(人によって)十分にありうることだと思います。
しかし一方で、ターミナルエミュレータを終了させても動き続けてほしいケースもあるでしょう。
nohup コマンド
終了する際にはkillコマンドを使用します。nohupは簡単に使用できますが、プロセスをフォアグランドに戻すことはできませんし、終了方法もkillコマンドに限られてしまう為、やや使い勝手が悪いといえます。
screen
nohupでやりたいことができない場合には、screenコマンドの仕様を検討しましょう。
screenコマンドでバックグラウンド実行に必要な情報のみを簡易にまとめます。
screenの起動
screen
screenの中断(detach)
Ctrl+a, d
Ctrl+a, Ctrl+d
screenセッションの一覧表示
screen -ls
screenの再開(attach)
screen -r [接続ID]
※候補が1つの場合「接続ID」は省略可。
screenセッションの終了
exit (すべてのウインドウで)
Ctrl+a, Ctrl+\
※screenコマンドの詳しい説明はこちらを参照してください。
余談
シェルの先頭に「#!/bin/bash」「#!/bin/sh」※などと書くと、ファイルをシェルプロセスに引き渡して実行されます。このとき、psコマンド(ps x)を実行するとCOMMAND欄に「/bin/sh シェル名」と表示されます。
※Linuxでは、/bin/sh は実際には /bin/bash へのシンボリックリンクとなっているため、「#!/bin/sh」は「#!/bin/bash」と同じ意味になる。なので「#!/bin/sh」はあまり意味がない。「#!/bin/bash」と書くようにしたほうがいい。
しかし「#!/bin/bash」を省略すると、それぞれの行を単体のコマンドとして実行するようで、psコマンドを実行するとCOMMAND欄に「/bin/sh シェル名」と表示されなくなります。代わりにシェル内に記述されたコマンドが単体で表示される為、非常に分かりにくくなります。これがバックグラウンド実行された場合には、さらに分かりにくくなります。
「#!/bin/bash」などの記述はできるだけ書くようにしましょう。
こちらも参考にしてください。
2011/09/07