2013-05-23 12 views
22

Was könnte dazu führen, dass ein C, MPI-Programm mit der Bibliothek SUNDIALS/CVODE (ein numerischer ODE-Solver) auf einem Gentoo-Linux-Cluster läuft, um mir wiederholt Signal 15 received. zu geben?Was ist "Signal 15 empfangen"

Wird dieser Code von MPI, Sundials, Linux, C oder wer ausgegeben?

Beachten Sie, dass ich ein Anfänger mit den folgenden Technologien bin: C, MPI, SUNDIALS/CVODE und Linux.

Ich kann nichts finden, das durch googling the message verwandt scheint. Ich weiß nicht einmal, wo ich anfangen soll. (Dies ist eine dieser Fragen, in denen "alles hilft" ist wörtlich zu nehmen.)

(Als beiseite/nachträglicher Grund, warum Chrome Wörterbuch das Wort "Googeln" nicht erkennen?).

+1

Signal 15 ist normalerweise "SIGTERM". Jemand hat deinem Programm gesagt, dass er aufhören soll. –

Antwort

39

Dies zeigt an, dass der Linux einen an Ihren Prozess geliefert hat. Dies geschieht normalerweise auf Anforderung eines anderen Prozesses (über kill()), könnte aber auch von Ihrem Prozess an sich selbst gesendet werden (unter Verwendung von raise()). Dieses Signal fordert eine ordnungsgemäße Beendigung Ihres Prozesses.

Wenn Sie einen schnellen Spickzettel von Signalnummern benötigen, öffnen Sie ein Bash-Shell und:

$ kill -l 
1) SIGHUP 2) SIGINT 3) SIGQUIT 4) SIGILL 
5) SIGTRAP 6) SIGABRT 7) SIGBUS 8) SIGFPE 
9) SIGKILL 10) SIGUSR1 11) SIGSEGV 12) SIGUSR2 
13) SIGPIPE 14) SIGALRM 15) SIGTERM 16) SIGSTKFLT 
17) SIGCHLD 18) SIGCONT 19) SIGSTOP 20) SIGTSTP 
21) SIGTTIN 22) SIGTTOU 23) SIGURG 24) SIGXCPU 
25) SIGXFSZ 26) SIGVTALRM 27) SIGPROF 28) SIGWINCH 
29) SIGIO 30) SIGPWR 31) SIGSYS 34) SIGRTMIN 
35) SIGRTMIN+1 36) SIGRTMIN+2 37) SIGRTMIN+3 38) SIGRTMIN+4 
39) SIGRTMIN+5 40) SIGRTMIN+6 41) SIGRTMIN+7 42) SIGRTMIN+8 
43) SIGRTMIN+9 44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 
47) SIGRTMIN+13 48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 
51) SIGRTMAX-13 52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 
55) SIGRTMAX-9 56) SIGRTMAX-8 57) SIGRTMAX-7 58) SIGRTMAX-6 
59) SIGRTMAX-5 60) SIGRTMAX-4 61) SIGRTMAX-3 62) SIGRTMAX-2 
63) SIGRTMAX-1 64) SIGRTMAX  

Sie den Absender, wie durch Verwendung eines geeigneten Signal-Handler bestimmen können:

#include <signal.h> 
#include <stdio.h> 
#include <stdlib.h> 

void sigterm_handler(int signal, siginfo_t *info, void *_unused) 
{ 
    fprintf(stderr, "Received SIGTERM from process with pid = %u\n", 
     info->si_pid); 
    exit(0); 
} 

int main (void) 
{ 
    struct sigaction action = { 
    .sa_handler = NULL, 
    .sa_sigaction = sigterm_handler, 
    .sa_mask = 0, 
    .sa_flags = SA_SIGINFO, 
    .sa_restorer = NULL 
    }; 

    sigaction(SIGTERM, &action, NULL); 
    sleep(60); 

    return 0; 
} 

Beachten Sie, dass die Signalhandler enthält auch einen Anruf an exit(). Es ist auch möglich, dass Ihr Programm weiterhin ausgeführt wird, indem das Signal ignoriert wird, aber dies wird im Allgemeinen nicht empfohlen (wenn es ein Benutzer tut, besteht eine gute Chance, dass ihm ein SIGKILL folgt, wenn Ihr Prozess nicht beendet wird) Sie haben Ihre Gelegenheit verloren, irgendwelche Aufräumarbeiten durchzuführen).

+0

Diese Liste ist nicht sehr hilfreich. Irgendeine Idee, wie ich feststellen kann, wer mir das SIGTERM schickt? Das einzige, was ich sagen kann ist, dass mein Code es nicht tut (weil ich nicht weiß, wie man ein SIGTERM sendet). – Jeff

+1

@Jeff: Ich habe meinen Beitrag mit einem Snippet aktualisiert, das Ihnen helfen soll, die PID des Absenders zu bestimmen. Um es in Aktion zu sehen, können Sie diesen Code ausführen und von einer anderen Shell ausführen "kill ", um es zu sehen, die PID des Absenders zu drucken. – FatalError

+0

Danke für den Code @FatalError (cooler Name, BTW). Ich bekomme, dass dies mir die PID des SIGTERMing Prozesses zeigt und ich kompilierte es. Aber wie benutze ich es? Soll es ein eigenständiges Programm sein, das im Hintergrund läuft, während ich mein Programm laufe? Wenn ja, wie starte ich es? Muss ich dieses Programm auf jedem Knoten des Clusters ausführen (oops, habe ich vergessen zu erwähnen, dass mein Programm auf einem Cluster läuft?)? Angenommen, ich verwende "Bildschirm", muss es in jedem Bildschirm ausgeführt werden? Ich weiß, eine Menge Fragen, aber ich bin verloren. – Jeff

Verwandte Themen