如何對需要 sudo 的命令使用 bash 超時功能?
在 Bash 中,這將為慢命令設置 10 秒的時間限制
timeout 10 slowcommand
我想知道如何才能獲得相同的行為,如果我必須呼叫sudo才能執行slowcommand,即:
timeout 10 sudo slowcommand
這將限制sudo,而不是slowcommand ……在使用 sudo 時有沒有一種優雅的方法來做到這一點?
編輯:假設不允許使用 sudo 執行超時。
timeout
不是bash
外殼或任何外殼的內置/功能(除非您想考慮busybox sh,其中busybox命令可以視為外殼的內置)。
timeout
是一個非標準的獨立實用程序,其中存在幾個通常不兼容的實現(也存在timelimit
具有相同功能的實用程序)。在:
timeout 10 sudo slowcommand
該實用程序的 GNU 實現的目前版本
timeout
(來自 GNU coreutils,再次與 GNU shell 不同bash
)執行sudo slowcommand
並將 SIGTERM 命令發送到其自己的程序組,如果sudo
未在 10 秒內完成。然而,執行的程序
sudo
改變了使用者ID,而sudo
產生執行的程序slowcommand
也將以不同的uid執行,因此即使兩個程序與正在執行的程序在同一個程序組中timeout
,timeout
也無權向其發送信號他們。有可能的方法。您可以安排核心發送一些信號,而不是像執行這樣的非特權程序
timeout
。例如,您可以讓它發送:
- SIGPIPE 如果
slowcommand
寫入封閉管道:sudo slowcommand | timeout 10 cat
slowcommand
如果 SIGPIPE在 10 秒後向標準輸出寫入內容,將導致發送到 SIGPIPE 。(順便說一句,這裡,
cat
和sudo
都slowcommand
將在同一個程序組中執行,因此與 相同timeout 10 sudo slowcommand | cat
)。
- SIGXCPU 如果
slowcommand
使用超過其分配的 CPU 時間限制:(ulimit -t 10; exec sudo slowcommand)
如果它使用 10 秒的 CPU 時間,將導致
slowcommand
被殺死。
- SIGHUP 如果終端掛斷,並且
sudo
不是會話負責人:timeout 10 script -qfc 'sudo slowcommand; exit' /dev/null
(這裡假設
util-linux
腳本)
- 信號/信號退出。您還可以使用
expect
/zpty
/script
/之類的東西screen
來模擬終端並^C
在 10 秒後發送一個字元,以便將 SIGINT 發送到該終端的前台程序組。