Bash

如何對需要 sudo 的命令使用 bash 超時功能?

  • November 16, 2020

在 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執行,因此即使兩個程序與正在執行的程序在同一個程序組中timeouttimeout也無權向其發送信號他們。

有可能的方法。您可以安排核心發送一些信號,而不是像執行這樣的非特權程序timeout。例如,您可以讓它發送:

  • SIGPIPE 如果slowcommand寫入封閉管道:
sudo slowcommand | timeout 10 cat

slowcommand如果 SIGPIPE在 10 秒後向標準輸出寫入內容,將導致發送到 SIGPIPE 。

(順便說一句,這裡,catsudoslowcommand將在同一個程序組中執行,因此與 相同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 發送到該終端的前台程序組。

引用自:https://unix.stackexchange.com/questions/619920