Linux
如果某個程序安靜了一段時間,則終止該程序
我有一個實用程序,它有一個討厭的習慣,就是安靜地呆在那裡,我已經知道它在這個過程中需要多長時間,所以我
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
,您必須依賴dd
GNU(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)
(這不起作用
zsh
或ksh93
因為$!
不包含your-command
那裡的pid)。