我有一个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
-硬限制