procesには2種類あり、forward processとbackground processである。
forward processは処理が終了するまで他のプログラムの実行ができない。
プログラムの実行をしつつ、他の作業も行いたい場合にはbackground processが有効である。
本記事に含まれる内容
- background process化と終了方法
- 実行結果をファイルに出力する方法
- ターミナルウィンドウを閉じてもプロセスを終了させない方法
background process化と終了方法
数字を毎秒足し上げていくsum.pyを実行したいファイルとする。
import time
x = 0
while True:
time.sleep(1)
x += 1
print(x)
下記実行後、毎秒加算の結果が出力される
$ python sum.py
以下とすることで、プロセスIDが出力されbackgroundで実行され続ける
$ python sum.py &
このプロセスを終了する場合は以下の通り
$ kill -9 {プロセスID}
実行結果をファイルに出力する方法
上記のまでの方法ではterminalに実行結果が出力され続ける。
他の作業を行なっている場合にこれは煩わしいので、新規にファイルを作成し、実行結果をファイルに出力することを考える。
以下でoutという名前のファイルを作成した。
$ python sum.py > out &
作成したoutというファイルに出力があるか確認するため、outの最終行を確認する。
$ tail -f out
上記を実行しても出力はない。
また、以下を実行してもファイルは空であることが確認される。
$ cat out
これは実行されたPythonプログラムの出力はバッファメモリに保存されるためである。つまり実行したPythonプログラムの処理が終了するまでoutには書き込みされない。
以下とすることで、逐次的にファイルに保存される。
$ python -u sum.py > out &
作成したoutというファイルに出力があることが確認できる。
$ tail -f out
ターミナルウィンドウを閉じてもプロセスを終了させない方法
上記までの方法ではファイル実行中のターミナルウィンドウを閉じると処理が停止する。以下を実行することで処理が終了されない。
$ nohup python -u add.py &
(nohupはno hung upの略)
以下を省略した理由は、nohupを使用した場合出力先を指定しなくても自動的にログファイルが生成されるからである。
> out
以下の様にプロセスを終了したい場合、
まず実行中のプロセスのうち、add.pyに関わるものをマッチングで検索する。
$ ps ax | grep add.py
取得したプロセスIDを終了する。
$ kill -9 {プロセスID}