CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
みなさんこんにちは。株式会社パイプラインの濱田です。前回はコマンドをフォアグラウンドプロセスとして実行する方法について取り上げましたが、今回はフォアグラウンドプロセスの対になる概念、バックグラウンドプロセスの実行方法、そしてコマンド実行の応用について取り上げます。
前回、sleepコマンドやpsコマンドなどを実行しましたが、これらコマンドはフォアグラウンドプロセスとして実行されていました。フォアグラウンドプロセスは、コマンド実行中にシェルを独占しますので、コマンドが終了するまでそのシェルでは他のコマンドを実行することができません。
しかし、大量のデータを処理するなどの用途で、あらかじめコマンドの終了までに時間がかかることがわかっている場合などはコマンドをバックグラウンドプロセスとして実行することで、その間シェル上で他のコマンドを実行することができます。
あるコマンドやシェルスクリプトをバックグラウンドで実行するにはコマンドの後に「&」をつけて実行します。
sleep 60 &
このように、60秒間スリープするコマンドを実行してみましょう。「&」をつける位置は、引数の最後です。「sleep & 60」と実行してはいけません。
sleep 60 & を実行後にターミナルを見ると、プロセスIDが表示されます。今どれだけのバックグラウンドプロセスが実行されているかを確認するには「jobs」コマンドを実行します。
jobsコマンドを実行すると、バックグラウンドプロセス実行中、つまりsleepコマンドを実行後60秒以内にjobsコマンドを実行すると「Running」と、バックグラウンドプロセスが終了後、すなわちsleepコマンド実行後60秒以降後のjobsコマンドを実行すると「Done」と表示され、再度jobsコマンドを実行すると何も表示されずにシェルに戻ります。
次に、「sleep 60 &」を3回実行してから「jobs」コマンドを実行してみましょう。以下の例のように、3つのバックグラウンドプロセスが実行されていることがわかります。
しかし、特定のバックグラウンドプロセスを中止したいときにプロセスIDが表示されていないと不便なので、jobsコマンドの引数に「-l」をつけて実行する習慣をつけるとよいでしょう。
1分以上経過した後、再度jobsコマンドを実行すると、これまでに実行した3つのsleepコマンドプロセスが終了したので「Done」と表示されています。
バックグラウンドプロセスを途中で中止させる(強制終了させる)には、killコマンドでPIDを指定して中止させることをおすすめします。fgコマンドを使ってバックグラウンドプロセスをフォアグラウンドプロセスにしてから「Ctrl+C」で中止させる方法もありますが、ここでは割愛します。
まず、「sleep 60 &」を3回実行してから「jobs -l」を実行します。すると以下のようにsleepコマンドのプロセスが3つ表示されます。ここで、2番目に実行したsleepコマンドのプロセスをkillコマンドで中止させてみましょう。その後、「jobs -l」コマンドを実行して確認します。
上記のように、2番目に実行したsleepコマンドはkilledと表示され、1番目と3番目に実行したsleepコマンドは「Running」と表示されています。
このようにして、任意のプロセスを中止させるにはプロセスID(PID)を指定してkillコマンドを実行すること、バックグラウンドプロセスのPIDを確認するにはjobsコマンドに「-l」オプションをつけて実行するとわかりやすいことがおわかりいただけたかと思います。
例えば、終業間際にファイルのバックアップなど、時間がかかるタスクを任されることがあるかと思います。このような場合に、バックアップが終わるまでPCの電源を入れっぱなしにしないといけない(帰宅できない)のでしょうか?そんなことはありません。あるコマンドをバックグラウンドで実行する際、コマンドの先頭に「nohup 」をつけることで、端末のセッションを閉じてもなおバックグラウンドプロセスが実行され続けるのです。コマンドは以下のように実行します。
nohup /path/to/hoge.sh &
nohupをつけてコマンドを実行した際、カレントディレクトリに nohup.out というファイルが出力されます。カレントディレクトリに書き込み権限がない場合は、ホームディレクトリに nohup.out ファイルが出力されます。
コマンドの成否をきちんとログに出力したい場合は、メッセージの内容やテキストのフォーマット、ファイル名やログのローテーションなどを設計したほうがよいのですが、簡易なログで充分な場合は、 nohup.out を確認するという方法でもよいでしょう。
CTC 教育サービスではLinux をはじめ多数の研修コースが用意されています。ご自身の興味や業務の必要性にあったコースを受講してみてはいかがでしょうか。
https://www.school.ctc-g.co.jp/category/
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes