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

v01*_*dya 5 linux

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

我的问题是:有没有办法做一些事情,只有在特定秒数内没有输出时才会终止进程?

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

./application > output.log &
tail -f output.log
Run Code Online (Sandbox Code Playgroud)

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

但它看起来很乏味,如果有一个现有的命令,我不想经历所有这些。

pah*_*pah 3

据我所知,没有一个标准实用程序可以做到这一点,但对于单行来说一个好的开始是:

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

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

一些提示:

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

您还可以alias使用以下方法为此设置:

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

然后只需发出命令即可随时使用它kill_application

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