为C++应用程序启用核心转储(通过 apache -> Perl -> C++ 调用)



我有一个web GUI,它提供了一个c++应用程序的开/关控制。c++应用程序是从perl包装器调用的,perl包装器的工作是保持程序运行,并在程序停止时重新启动。

点击网页按钮(最终)会在后台启动startWrapper.pl

问题是c++应用程序每隔几天就会崩溃一次。我想为这个后台任务启用核心转储。

然而,我读过的一切似乎都需要tty和/或登录会话(例如。ulimit命令)。

如何为这个后台任务启用核心转储?可以从c++源代码中设置配置吗?Linux配置文件?

作为伪代码,startWrapper.pl(简单地)看起来像:

if (is_process_running() )
{
    return;
}
else
{
    while (1)
    {
        system("/path/to/c++/application &");
        while (1)
        {
            if (not_running_anymore())
                 break;
            sleep(10);
        }
    }
}

编辑我点击答案太早了。如果我a)直接调用二进制文件或b)从perl包装器调用它,则使用setrlimit工作。但是,如果从apache调用perl包装器,它不会转储核心。(我在程序里放了一个"炸弹",在10秒后进行分段故障。当从apache调用时,包装器检测到它并重新启动二进制文件,但没有核心文件。)

这可能是一些用户ID与有效ID的问题吗?

Apache启动perl包装器为 Apache 。perl包装器使用system来启动二进制文件,它是setuid root。

编辑二

2016-08-17 13:50:35 : DvStorStartASIRecord.pl starting
2016-08-17 13:50:35 : DvStorStartASIRecord.pl: Starting DvASIRecord 0 0
2016-08-17 13:50:35 : DvASIRecord Current Dir: '/usr/local/dvstor/bin'
2016-08-17 13:50:35 : DvASIRecord Core Limits - Cur: 18446744073709551615 Max: 18446744073709551615
2016-08-17 13:50:35 : DvASIRecord: ASI recording started 0 0
2016-08-17 13:50:46 : DvStorStartASIRecord: DvASIRecord terminated unexpectedly. Restarting

2016-08-17 13:50:59 : DvStorOperation.cgi::startRecord() from 192.168.2.10
2016-08-17 13:50:59 : DvStorStartASIRecord.pl starting
2016-08-17 13:50:59 : DvStorStartASIRecord.pl: Starting DvASIRecord 0 0
2016-08-17 13:50:59 : DvASIRecord Current Dir: '/usr/local/dvstor/cgi-bin'
2016-08-17 13:50:59 : DvASIRecord Core Limits - Cur: 18446744073709551615 Max: 18446744073709551615
2016-08-17 13:50:59 : DvASIRecord: ASI recording started 0 0
2016-08-17 13:51:09 : DvStorStartASIRecord: DvASIRecord terminated unexpectedly. Restarting

编辑三世

ps相关进程清单

F S UID        PID  PPID  C PRI  NI ADDR SZ WCHAN  STIME TTY          TIME CMD
1 S root      1999     1  0  80   0 -  7525 poll_s Aug16 ?        00:00:01 /usr/sbin/httpd
5 S apache    2023  1999  0  80   0 -  7721 inet_c Aug16 ?        00:00:02 /usr/sbin/httpd
5 S apache    2024  1999  0  80   0 -  7721 inet_c Aug16 ?        00:00:02 /usr/sbin/httpd
5 S apache    2025  1999  0  80   0 -  7719 inet_c Aug16 ?        00:00:02 /usr/sbin/httpd
5 S apache    2026  1999  0  80   0 -  7719 inet_c Aug16 ?        00:00:02 /usr/sbin/httpd
5 S apache    2027  1999  0  80   0 -  7719 inet_c Aug16 ?        00:00:02 /usr/sbin/httpd
5 S apache    2028  1999  0  80   0 -  7721 inet_c Aug16 ?        00:00:02 /usr/sbin/httpd
5 S apache    2029  1999  0  80   0 -  7721 inet_c Aug16 ?        00:00:02 /usr/sbin/httpd
5 S apache    2030  1999  0  80   0 -  7721 inet_c Aug16 ?        00:00:02 /usr/sbin/httpd
5 S apache   27793  1999  0  80   0 -  7719 inet_c 09:47 ?        00:00:00 /usr/sbin/httpd
0 S apache   29436     1  0  80   0 -  1315 hrtime 09:48 ?        00:00:00 /usr/bin/perl /usr/local/dvstor/bin/DvStorStartASIRecord.pl tsNum=0
4 S root     29573     1  3 -40   - - 26599 hrtime 09:49 ?        00:00:00 /usr/local/dvstor/bin/DvASIRecord 0 2

是的,有可能从c++代码设置系统限制。看getrlimit, setrlimit函数

#include <sys/resource.h>
rlimit limitValue;
limitValue.rlim_cur = RLIM_INFINITY;
limitValue.rlim_max = RLIM_INFINITY;
setrlimit(RLIMIT_CORE, &limitValue);

RLIMIT_CORE代表核心大小RLIM_INFINITY -无限制rlim_cur -软限制rlim_max -硬限制

相关内容

  • 没有找到相关文章

最新更新