如果给定进程在Bash Linux中运行的时间超过指定时间,如何获取通知?

时间:2018-04-27 16:06:55

标签: bash

我一切顺利,我的节目在大约N秒内结束:

./maybe_deadlock

但有时会发生随机死锁,程序会永远挂起。

要调试这个,我想按照以下几行运行程序:How to debug a rare deadlock?

while true; do
  date
  gdb -ex 'set confirm on' -ex run -ex quit --args ./maybe_crash.out; 
done

但是为了让事情变得更方便,我想在N秒过后收到通知,所以我不必继续检查终端以查看stdout是否卡住了。

换句话说,如果N秒过去且程序没有完成,我想从https://unix.stackexchange.com/questions/144924/how-to-create-a-message-box-from-the-command-line运行一个任意命令。

我知道来自How to kill a child process after a given timeout in Bash?timeout命令,但我不想杀死我的进程,因为我想在之后在GDB上检查它。

我想我可以提出一个丑陋的解决方案,将进程置于后台,休眠,等待并触及一个哨兵文件,但让我们看看是否有更优雅的方法。

该程序可以测试解决方案:

#define _XOPEN_SOURCE 700
#include <stdlib.h>
#include <time.h>
#include <unistd.h>

int main() {
    if (time(NULL) % 2) {
        sleep(3);
    } else {
        while (1) {
            sleep(0x7FFFFFFF);
        }
    }
    return EXIT_SUCCESS;
}

1 个答案:

答案 0 :(得分:2)

根据unix.stackexchange.com上的this post,您可以查看进程运行的时间:

ps -o etime= -p "$$"

如果输出值太高,您可以让脚本报警。