如何在一段时间内杀死没有输出的进程

时间:2016-06-22 03:39:52

标签: linux

我已经编写了一个程序,假设要运行很长时间并将进度输出到stdout,但是,在某些情况下它会开始挂起,最简单的事情就是重新启动它

我的问题是:有没有办法做一些只有在特定秒数内没有输出才能杀死进程的东西?

我已经开始考虑它了,唯一想到的就是这样:

./application > output.log &
tail -f output.log

然后创建脚本,查看output.log上次修改的日期和时间并重新启动整个过程。

但它看起来非常乏味,如果现有命令,我会讨厌这一切。

2 个答案:

答案 0 :(得分:3)

据我所知,没有一个标准实用程序可以做到这一点,但单线程的良好开端是:

timeout=10; if [ -z "`find output.log -newermt @$[$(date +%s)-${timeout}]`" ]; then killall -TERM application; fi

至少,这将避免编写更复杂脚本的繁琐部分。

一些提示:

  • 使用find实用程序将output.log文件的上次修改日期与时间参考进行比较。
  • 时间参考由date实用程序返回,作为自EPOCH(1970-01-01 UTC)以来的当前时间(+%s)。
  • 使用bash $ []操作减去$ timeout值(示例中为10秒)
  • 如果上述find未返回任何输出,则文件未更改超过10秒。这将在if条件中触发true,并执行killall命令。

您还可以使用以下方式设置alias

alias kill_application='timeout=10; if [ -z "`find output.log -newermt @$[$(date +%s)-${timeout}]`" ]; then killall -TERM application; fi';

然后只需发出命令kill_application

,随时使用它

如果您想在没有人为干预的情况下自动重启应用程序,您可以安装crontab条目以便每分钟运行一次,并在killall之后发出应用程序重启命令(也许您也可以想要将-TERM更改为-KILL,以防应用程序对可处理信号无响应。)

答案 1 :(得分:2)

inotifywait可以在这里提供帮助,它可以有效地等待文件的更改。可以检查退出状态以确定事件(modify)是否在指定的时间间隔内发生。

$ inotifywait -e modify -t 10 output.log 
Setting up watches.
Watches established.
$ echo $?
2

男人的一些相关信息:

OPTIONS
   -e <event>, --event <event>
       Listen for specific event(s) only.

   -t <seconds>, --timeout <seconds>
       Exit  if  an  appropriate  event  has  not occurred within <seconds> seconds.

EXIT STATUS
   2  The -t option was used and an event did not occur in the specified interval of time.

EVENTS
   modify A watched file or a file within a watched directory was written to.