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

问题描述 投票:2回答:1

我一切顺利,我的程序在大约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

我知道来自timeoutHow to kill a child process after a given timeout in Bash?命令,但我不想杀死我的进程,因为我想在之后在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;
}
bash
1个回答
2
投票

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

ps -o etime= -p "$$"

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

© www.soinside.com 2019 - 2024. All rights reserved.