Linux

如果某個程序安靜了一段時間,則終止該程序

  • November 15, 2021

我有一個實用程序,它有一個討厭的習慣,就是安靜地呆在那裡,我已經知道它在這個過程中需要多長時間,所以我timeout用來解決這個問題,但有時它會在此之前完成它。timeout如果停止將輸出定向到標準輸出,是否有類似的工具會終止該程序?

使用zsh,您可以執行以下操作:

zmodload zsh/system
coproc your-command
while :; do
 sysread -t 10 -o 1 <&p && continue
 if (( $? == 4 )); then
   echo "Timeout" >&2
   kill $!
 fi
 break
done

這個想法是使用超時從輸出中讀取的-t選項。sysread``your-command

請注意,它使your-command’ 輸出成為管道。可能是your-command當它不去終端時開始緩衝它的輸出,在這種情況下,你可能會發現它在一段時間內沒有輸出任何東西,但這僅僅是因為緩衝,而不是因為它以某種方式掛起

您可以通過使用stdbuf -oL your-command恢復行緩衝(如果您的命令使用 stdio)或使用zpty而不是coproc偽造終端輸出來解決此問題。

使用bash,您必須依賴ddGNU(timeout如果可用):

coproc your-command
while :; do
 timeout 10 dd bs=8192 count=1 2> /dev/null <&${COPROC[0]} && continue
 if (($? == 124)); then
   echo Timeout >&2
   kill "$!"
 fi
done

除了coproc,您還可以使用程序替換:

while :; do
 timeout 10 dd bs=8192 count=1 2> /dev/null <&3 && continue
 if (($? == 124)); then
   echo Timeout >&2
   kill "$!"
 fi
done 3< <(your-command)

(這不起作用zshksh93因為$!不包含your-command那裡的pid)。

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