Python PR

【Python】ソースコードをバックグラウンドで実行する方法

記事内に商品プロモーションを含む場合があります

この記事では、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.logout3.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

ちゃんと削除することができました!