親プロセスからsubprocessで子プロセスを起動して、一定時間経過後親プロセスからkillする方法。
環境:CentOS7、Python3.6
コード
import subprocess
import time
cmd = """
while true
do
date
sleep 1s
done"""
p = subprocess.Popen(cmd, shell=True)
time.sleep(5)
p.kill()
実行結果
Sat Mar 24 17:01:26 JST 2018
Sat Mar 24 17:01:27 JST 2018
Sat Mar 24 17:01:28 JST 2018
Sat Mar 24 17:01:29 JST 2018
Sat Mar 24 17:01:30 JST 2018
subprocess.runや.callだと子プロセスの終了を待つため延々と実行されます。subprocess.Popenだと投げっぱなしのfire and forgetとなるらしい。
注意:shell=Trueはシェルインジェクションに悪用されるため、コマンドを入力を受け付けるような処理では使わないようにしてください。
Pythonを使わずにtimeoutコマンドで終了させる方法もあります。以下、参考資料。
参考:
一定時間でシェルコマンドを終了させるたった1つの方法
https://qiita.com/ma2saka/items/741b614418bf8fce04de
“Fire and forget” a process from a Python script
https://stackoverflow.com/questions/17937249/fire-and-forget-a-process-from-a-python-script