一、subprocess如何設置命令超時時間
最近遇到一個問題,就是我需要在服務器上執行某些shell命令,但是有些命令失敗的時候是不會自動終止的,只會一直停在那里,很耗時間。
因此想到了設置超時時間,而 subprocess 模塊是沒有超時功能的。至於為什么不用其他模塊執行shell命令,因為subprocess比較安全。
這時我一開始想到的是使用 multiprocessing.Process 進程的守護進程去實現的,但是發現還是很low而且實現不好。
后面就突然想到了定時器,線程模塊有,於是:
import subprocess from threading import Timer def kill_command(p): """終止命令的函數""" p.kill() def execute(command, timeout): # 執行shell命令 p = subprocess.Popen(command, stdout=subprocess.PIPE, stderr=subprocess.PIPE) # 設置定時器去終止這個命令 timer = Timer(timeout, kill_command, [p]) try: timer.start() stdout, stderr = p.communicate() return_code = p.returncode print(return_code) print(stdout) print(stdout) except Exception as ex: print(ex) finally: timer.cancel()
