いくつかのプロセスを起動するPythonスクリプトがあります。各プロセスは基本的にシェルスクリプトを呼び出すだけです。
from multiprocessing import Process
import os
import logging
def thread_method(n = 4):
global logger
command = "~/Scripts/run.sh " + str(n) + " >> /var/log/mylog.log"
if (debug): logger.debug(command)
os.system(command)
これらのスレッドのいくつかを起動します。これらはバックグラウンドで実行することを目的としています。これらのスレッドにタイムアウトを設定して、タイムアウトを超えると強制終了されるようにします。
t = []
for x in range(10):
try:
t.append(Process(target=thread_method, args=(x,) ) )
t[-1].start()
except Exception as e:
logger.error("Error: unable to start thread")
logger.error("Error message: " + str(e))
logger.info("Waiting up to 60 seconds to allow threads to finish")
t[0].join(60)
for n in range(len(t)):
if t[n].is_alive():
logger.info(str(n) + " is still alive after 60 seconds, forcibly terminating")
t[n].terminate()
問題は、プロセススレッドでterminate()を呼び出しても、起動されたrun.shスクリプトが強制終了されないことです。コマンドラインから強制的に強制終了するか、内部で終了するまで、バックグラウンドで実行を続けます。os.system()によって作成されたサブシェルも終了させる方法はありますか?