介紹如何在 Linux 系統上使用 timeout
指令限制程式的執行時間,避免問題程式執行太久。
限制程式執行時間
Linux 的 timeout
指令可用來限制指定程式的執行時間上限,如果程式執行的時間太久,超過指定的上限值,程式就會被終止(kill),其語法為:
timeout 時間 指令
時間的格式為浮點數加上時間單位,可用的單位有:
單位 | 意義 | 範例 |
---|---|---|
s |
秒 | 30s (30 秒) |
m |
分鐘 | 5m (5 分鐘) |
h |
小時 | 2.5h (2.5 小時) |
d |
天 | 1.5d (1.5 天) |
舉例來說,若希望 myscript.sh
這個指令稿的執行時間不可超過 30 秒,則可以這樣執行:
# 限制程式執行時間不可超過 30 秒
timeout 30s ./myscript.sh
保留狀態值
每個程式在執行完畢之後,都會傳回一個狀態值,如果希望 timeout
將指令的狀態值傳回,可以加上 --preserve-status
參數:
# 傳回程式的狀態值 timeout --preserve-status 30s ./myscript.sh
指定訊號
若要指定終止程式時要傳送的訊號(signal),可以使用 --signal
參數:
# 指定終止程式所使用的訊號 timeout --signal='SIGHUP' 30s ./myscript.sh
訊號在指定時亦可使用數字,可用的訊號名稱或數值可以使用 kill -l
指令查詢。
如果擔心程式在收到訊號之後,沒有正常終止,可以再加上 --kill-after
指定等待終止的時間,若超過這個時間,就會以 KILL
訊號終止程式:
# 若超過 5 秒未完成終止程式,則送出 KILL 訊號 timeout --kill-after=5s 30s ./myscript.sh