この記事では、Pythonのソースコードをバックグラウンドで実行する方法を解説します。
バックグラウンドで処理することによって表にその処理を出すことなくあとで結果のみを受け取ることができます。長くなりそうな処理はバックグラウンドで実行しちゃいましょう!
それでは、コードをバックグラウンドで実行する方法を見ていきましょう!
ソースコードをバックグラウンドで実行するには、コマンドラインでソースコードを実行する際に先頭にnohup
、末尾に&
を記述します。
nohup python スクリプト名 &
それでは、実際にソースコードをバックグランドで実行してみます。
適当にbg.py
という名前で以下のようなソースコードを作成します。
bg.py
import time
for i in range(30):
time.sleep(1)
print(f'{i+1} 回目の処理')
作成したらコマンドラインからバックグランドで実行してみます。
nohup python bg.py &
実行すると[プロセス数]
とPID
が表示されます。
[1] 46825
あとは処理が終わるまで待ちます。
処理が正常に終了するとdone
が表示され、エラーが起きるとexit
が表示されます。
バックグラウンドで実行しているプロセスを確認するには以下のコマンドを実行します。
ps u
バックグラウンドの実行を2回行っていると以下のような表示がされます。
ps u
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
user 46642 0.2 0.0 4297448 1952 s002 S 4:56PM 0:00.12 -zsh
user 46971 0.0 0.2 4244692 6888 s002 SN 5:20PM 0:00.06 /Users/user/.pyenv/versions/3.9.0/bin/python bg.py
user 46955 0.0 0.2 4253908 6968 s002 SN 5:20PM 0:00.12 /Users/user/.pyenv/versions/3.9.0/bin/python bg.py
user 33230 0.0 0.0 4297416 720 s001 Ss+ 水03PM 0:00.25 /bin/zsh -l
user 32882 0.0 0.0 4297416 308 s000 Ss+ 水03PM 0:00.06 /bin/zsh -l
nohup
を使ってコードをバックグラウンドで実行するとコマンドを実行したカレントディレクトリ内にnohup.out
という名前のファイルが作成され、出力結果が書き込まれます。
何度も実行すると出力結果が同じファイルに追記されてしまい、どんどんファイルが巨大になってしまいます。
なので、出力先を変更してバラバラに結果を保存しておく必要があります。
出力先を変更するには>
で出力先を繋げて指定します。
nohup python bg.py > ~/Desktop/Python/out.log &
上記はデスクトップにあるPythonディレクトリにout.log
という名前で出力するように指定しています。
2回目以降の出力はout2.log
、out3.log
とナンバリングすればわかりやすいです。
無限ループやバグなどで処理が終わらない場合、kill
でプロセスをキャンセルします。
kill -KILL PID
試しにプロセスをキャンセルしてみます。
以下の無限ループするコードをバックグラウンドで実行します。
import time
count = 1
while True:
time.sleep(1)
print(f'{count} 回目の処理')
count += 1
プロセスを確認すると先ほどの実行が追加されています。
ps u
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
user 47620 0.0 0.1 4253908 4964 s002 SN 6:18PM 0:00.13 /Users/user/.pyenv/versions/3.9.0/bin/python bg.py
user 46642 0.0 0.0 4297448 1820 s002 S 4:56PM 0:00.29 -zsh
user 32882 0.0 0.0 4297416 308 s000 Ss+ 水03PM 0:00.06 /bin/zsh -l
ではプロセスID(PID)をプロセス一覧から確認して削除します。
kill -KILL 47620
実行すると以下のような表示がされます。
[1] + killed nohup python bg.py
念のためプロセス一覧を確認してみます。
ps u
USER PID %CPU %MEM VSZ RSS TT STAT STARTED TIME COMMAND
user 46642 0.0 0.0 4297448 1816 s002 S 4:56PM 0:00.30 -zsh
user 32882 0.0 0.0 4297416 304 s000 Ss+ 水03PM 0:00.06 /bin/zsh -l
ちゃんと削除することができました!