2016-08-10 1 views
2

Ich habe eine Web-GUI, die ON/OFF-Kontrolle einer C++ - Anwendung bietet. Die C++ App wird von einem Perl-Wrapper aufgerufen, dessen Aufgabe es ist, das Programm am Laufen zu halten und es neu zu starten, wenn es angehalten wurde.Aktivieren Sie Core Dumps für C++ App (über Apache aufgerufen -> Perl -> C++)

Wenn Sie auf die Webseitenschaltfläche klicken, wird (im Endeffekt) startWrapper.plim Hintergrund gestartet.

Das Problem ist, dass die C++ App alle paar Tage mit segfault abstürzt. Ich möchte Core Dumps für diese Hintergrundaufgabe aktivieren.

Allerdings scheint alles, was ich gelesen habe, eine TTY- und/oder Login-Sitzung zu erfordern (z. B. ulimit-Befehl).

Wie würde ich Core Dumps für diese Hintergrundaufgabe aktivieren? Möglich, die Konfiguration aus dem C++ - Quellcode zu setzen? Linux Konfigurationsdatei?

Als Pseudo-Code, startWrapper.pl (kurz) wie folgt aussieht:

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

     while (1) 
     { 
      if (not_running_anymore()) 
       break; 
      sleep(10); 
     } 
    } 
} 

EDIT ich zu früh die Antwort angeklickt. Die Verwendung von setrlimit funktioniert, wenn ich a) die Binärdatei direkt aufrufen oder b) sie vom Perl Wrapper aufrufen. Wenn der Perl-Wrapper jedoch von Apache aufgerufen wird, wird der Core nicht entladen. (Ich habe eine "Bombe" in das Programm eingefügt, um nach 10s segzufallen. Wenn der Wrapper von Apache aus aufgerufen wurde, hat er ihn erkannt und die Binärdatei neu gestartet.)

Könnte das eine Benutzer-ID oder eine effektive ID sein?

Apache startet den Perl Wrapper als Apache. Der Perl-Wrapper verwendet system, um die Binärdatei zu starten, die setuid root ist.

EDIT II

manuell gestartet

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 

über Apache Gestartet

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 

EDIT III

ps Auflistung der damit verbundenen Prozesse

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 
+0

Es ist C++ ähnliche, wenn es eine Möglichkeit, Kern zu ermöglichen, ist Dumps aus dem C++ Code, z. B. Wenn es eine sysctl-, ioctl-, usw.-API gibt, die nur für diese Binärdatei aktiviert würde. – Danny

+0

Eigentlich keine Ahnung, warum das bei Apache nicht funktioniert. Vielleicht legt Apache aus bestimmten Gründen harte Grenzen fest, die von Ihrem Kindprozess nicht erhöht werden können. Um dies zu untersuchen, würde ich gertrlimit aufrufen, um weiche und harte Grenzen zu prüfen, während ich von Perl Wrapper und dann von Apache laufe. Ich schlage auch vor, auf Fehlercode von setrlimit zu prüfen. – Marcin

+0

Überprüfung der Grenzen, sowohl 'cur' und 'max' sind gleich, ob manuell oder über Apache gestartet. Siehe die Protokolle oben. Der einzige Unterschied scheint das aktuelle Arbeitsverzeichnis zu sein (wie von get_current_dir_name() gemeldet). [und auch keine Core Dumps dort]. Könnte Apache den Speicherort der Kerndateien an einen anderen Ort umleiten? – Danny

Antwort

3

Ja, es gibt eine Möglichkeit, Systemgrenzen von C++ Code zu setzen. Schauen Sie sich getrlimit, setrlimit Funktionen an.

#include <sys/resource.h> 

rlimit limitValue; 
limitValue.rlim_cur = RLIM_INFINITY; 
limitValue.rlim_max = RLIM_INFINITY; 

setrlimit(RLIMIT_CORE, &limitValue); 

RLIMIT_CORE steht für Kerngröße RLIM_INFINITY - unbegrenzt rlim_cur - weiche Grenze rlim_max - harte Grenze

+0

Bitte beachten Sie die Änderung. Das funktioniert fast, aber nicht ganz ... – Danny