当进程停止产生进一步的输出时终止进程

当进程停止产生进一步的输出时终止进程

是否有一个 shell 工具可以探测子进程是否仍在产生输出,否则在指定的超时后将其杀死?

我用offlineimapGmail 备份,但这非常非常不稳定。由于 IMAP 条件或其他原因,处理会定期停止。该过程需要不断重新启动才能看到任何进展。因此,为什么我目前正在使用:

(ulimit -t 300 ; offlineimap)

循环中。每五分钟重新启动一次该工具;无论。

这有点令人不满意,因为它要么在进程实际上仍在执行某些工作时过早终止进程,要么在进程已经阻塞时仍等待 4 分钟。我宁愿有这样的东西:

offlineimap > output.log &
stillmakingoutput? --timeout 60 output.log || kill $!

这可能可以通过自定义执行/监视脚本来实现,但是对于这种情况没有一些通用的方法吗?


答案1

因此,使用“小”超时脚本成功了,该脚本检查日志文件大小以确定进程是否仍在工作。不太漂亮,但确实有帮助:

#!/bin/sh
TIMEOUT=$1
FILE=$2
PID=$3
if [ -z "$PID" ]
then
   echo $0 timeout file pid
   echo "     e.g. 60 /tmp/log 16325"
   exit
fi
echo "stalekill: timeout=$TIMEOUT file=$FILE pid=$PID"    

sleep 1

SIZE=0
while true
do
   sleep 3

   NEWSIZE=$(stat -c%s "$FILE")
   if [ "$NEWSIZE" -eq "$SIZE" ]
   then
      echo "stalekill '$FILE' unchanged; $SIZE"

      sleep $TIMEOUT
      NEWSIZE=$(stat -c%s "$FILE")

      if [ "$NEWSIZE" -eq "$SIZE" ]
      then
         kill $PID || sleep 2 && kill -9 $PID
         exit
      fi
      echo "stalekill '$FILE' changed; $SIZE..$NEWSIZE"
   else
      echo "stalekill '$FILE' changed; $SIZE..$NEWSIZE"
   fi
   SIZE=$NEWSIZE 
done

调用方式如下(循环):

./offlineimap.py >> ./log.txt 2>&1   &   stalekill 25 ./log.txt $!

时机并不算太专业,如果还能检查一下进程是否已经自行终止就更好了;但基本上做到了这一点。

但尽管如此,如果有人知道这个任务的不同或更标准化的解决方案:accepted answer tick still available

答案2

尝试一下http://pyropus.ca/software/getmail/。您可以为每个 IMAP 帐户设置超时。

答案3

您可能想看一下莫尼特这可能可以满足您的需求。

相关内容