如果进程在一段时间内保持安静,则将其杀死


9

我有一个实用程序,它有一个安静的习惯,那就是安静下来并呆在那里,我已经知道它要花多长时间来完成这项工作,所以我timeout经常在与之抗争,但是有时它在那之前就做了。timeout如果停止将输出定向到stdout,是否有类似的工具可以终止该进程?

Answers:


8

使用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选项。sysreadyour-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因为其中$!不包含pid your-command)。


1
嗨!谢谢,有可能您可以对此发表评论,以便我了解它在做什么吗?
Benjojo 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.