プログラムをバックグラウンドで実行する


バックグラウンドジョブ

Unix系のOSでは、 端末からログインして起動されたプロセス (プログラムの実行) は、 とくに指示されなければ 端末から (ふつうはキーボードから行単位で) 情報をうけとり、 端末に情報を出す形で動く。 このようなつかいかたを、つぎにのべるバックグラウンドジョブと区別して、 フォアグラウンドジョブ (foreground job)ということがある。 ログアウトするとフォアグラウンドジョブは終わってしまう。

プロセスを端末から切り離して実行することもできる。 こうすれば、ログアウトしてもプログラムの実行はつづく。 このようなつかいかたを、バックグラウンドジョブ (background job) という。


シェルからバックグラウンドジョブを起動する

シェルが bash, csh のいずれでも、 コマンド行の最後に「&」をつけると、 そのコマンドの実行がバックグラウンドにまわり、 端末からは次のコマンドをいれることができる。

ログアウトしたり端末を終了したりしてもバックグラウンドジョブが とまらないようにするために、コマンドのまえに「nohup」をつける。


入力が要求されるばあい

バックグラウンドにまわされたプロセスが端末から入力を要求するばあい、


標準出力と標準エラー出力の処理

Unix系のOS上のプログラムは、ふつう、出力ファイル名を指定しなくても、 「標準出力」と「標準エラー出力」のふたつの出力をもつ。 フォアグラウンドジョブのばあいは、いずれも端末にわりあてられているが、 「>」などの redirection 指定によって、ファイルにまわすこともできる。

バックグラウンドジョブのばあいは、 標準出力と標準エラー出力の両方をファイルにまわす (あるいは捨ててしまう) 必要がある。 ここでは、(例として) command というコマンドを実行し、 標準出力と標準エラー出力をまぜて (例として) log.txt というテキストファイルに書きだすことにしてみる。

csh の ばあい
nohup command >& log.txt &
bash の ばあい
nohup command >log.txt 2>&1 &

Pythonで図形出力をするばあいの注意

図形出力をふくむ (matplotlib をつかう) Python プログラムを実行すると、 プロセスをバックグラウンドにまわしても、 端末に要求が出ることがある。

たとえば、Windows の TeraTerm から接続しているばあいには、 つぎのような窓がでる。

TTSSH
サーバはこのマシンに転送を試みました.
localhost 上の Xサーバーへの接続を要求しました (ディスプレイ 0:0).
接続は拒否されました (おそらくサービス停止中です) (code 10061).
転送接続を終了します.
[OK]

(1) もし plt.show をつかっているならば、 それをつかわないように (図を plt.savefig で画像ファイルにしまうように) プログラムを修正する。

(2) plt.show をつかっていなくて、上記のエラーメッセージ窓が出たならば、 窓の「OK」ボタンをクリックすると、正常にさきにすすむ。 しかし、ログアウトしてしまっていると、その機会が得られず、異常終了になるだろう。

(3) プロセスをバックグラウンドにまわしたいならば、 端末に要求が出ないようにプログラムを修正したほうがよい。 それには、プログラムの「import matplotlib.pyplot as plt」よりまえに、つぎの2行をいれると、 このエラーメッセージをださずにさきにすすむ。

import matplotlib
matplotlib.use("Agg")

この件はいくつかのウェブページを参照したが、つぎのページを例にあげておく。

雑多な記録 : python: matplotlib: cui環境 (杉本 高大 さん Last modified: 2021/06/27 22:04)
http://www2.yukawa.kyoto-u.ac.jp/~koudai.sugimoto/dokuwiki/doku.php?id=python:matplotlib:cui%E7%92%B0%E5%A2%83

matplotlib 入門 : とりあえず描く (柞刈 湯葉 さん)
https://yubais.net/doc/matplotlib/introduction.html


走っているプロセスを知る

ps というコマンドがある。オプションなしで実行すると、 その端末で起動されたプロセスだけが 表示される。

過去に、あるいは別の端末から起動されたものもふくめて、 自分が起動したプロセスを知るにはつぎのようにする。

ps aux | grep 自分のユーザID

件数のおおいときは

ps aux | grep 自分のユーザID | less

ここで「|」は縦棒で、左側のコマンドの標準出力を 右側のコマンドの標準入力にする「パイプライン」処理を指定している。

左端の列にユーザID、2番めの列にプロセス番号、 右端の列に起動したコマンドの頭の部分が表示されるだろう。

また、top というコマンドがある。 これは、現在、その計算機の CPU 能力を多くつかっている順に プロセスを表示する。q で top コマンドからぬける。 (top 自体も CPU能力をくうので、短時間でやめたほうがよい。)


プロセスをとめる

kill というコマンドがある。

kill のあとに (空白をあけて) プロセス番号をかけば、 OS は そのプロセスをとめようとする。 しかし通常はそれだけではとまらない。

プロセスを強制的にとめたいときは、kill のオプションとして (プロセス番号のまえに) 「-9」 を指定する。 まちがったプロセスをとめてしまわないように、注意してつかってほしい。


2023-11-27
増田 耕一 (MASUDA Kooiti)
増田の個人サイトでの [Linuxをつかう] [計算機をつかった気象分野の教材] [セミナー B, F, G 合同] [セミナーF] [教材目録ページ] [日本語入り口ページ] [ホームページ]