Was ist “Signal 15 empfangen”

Lesezeit: 4 Minuten

Was könnte ein C, MPI-Programm verursachen, das eine Bibliothek namens SONNENUHREN/CVODE (ein numerischer ODE-Löser), der auf einem Gentoo-Linux-Cluster läuft, um mir wiederholt zu geben Signal 15 received.?

Wird dieser Code von MPI, Sundials, Linux, C oder wem herausgegeben?

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

Ich kann nichts finden, was verwandt zu sein scheint Nachricht googeln. Ich weiß gar nicht wo ich anfangen soll zu suchen. (Das ist eine dieser Fragen, bei denen „alles hilft“ ganz wörtlich zu nehmen ist.)

(Nebenbei bemerkt, warum erkennt das Wörterbuch von Chrome das Wort “googeln” nicht?).

  • Signal 15 ist normalerweise SIGTERM. Jemand hat Ihrem Programm gesagt, dass es beendet werden soll.

    – Daniel Fischer

    23. Mai 2013 um 20:52 Uhr

Benutzeravatar von FatalError
Fataler Fehler

Dies zeigt an, dass Linux a geliefert hat SIGTERM zu Ihrem Prozess. Dies geschieht normalerweise auf Anfrage eines anderen Prozesses (via kill()), könnte aber auch von Ihrem Prozess an sich selbst gesendet werden (mit raise()). Dieses Signal fordert ein ordnungsgemäßes Herunterfahren Ihres Prozesses an.

Wenn Sie einen schnellen Cheatsheet mit Signalnummern benötigen, öffnen Sie eine 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 können den Absender ermitteln, indem Sie einen geeigneten Signal-Handler verwenden, z. B.:

#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 der Signal-Handler auch einen Aufruf an enthält exit(). Es ist auch möglich, dass Ihr Programm weiter 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 ein SIGKILL folgt, wenn Ihr Prozess nicht beendet wird, und Sie haben dann Ihre Gelegenheit verpasst, etwas aufzuräumen).

  • 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

    24. Mai 2013 um 4:38 Uhr

  • @ Jeff: Ich habe meinen Beitrag mit einem Ausschnitt aktualisiert, der 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 aus “kill ” ausführen, um zu sehen, wie es die PID des Absenders ausgibt.

    – Fataler Fehler

    24. Mai 2013 um 12:32 Uhr


  • Danke für den Code @FatalError (cooler Name, übrigens). Ich bekomme, dass dies mir die PID des SIGTERMing-Prozesses zeigt und ich habe es kompiliert. Aber wie benutze ich es? Soll es ein eigenständiges Programm sein, das im Hintergrund läuft, während ich mein Programm ausführe? 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 ausgeführt wird?)? Angenommen, ich verwende screen, muss es in jedem Bildschirm ausgeführt werden? Ich weiß, viele Fragen, aber ich bin verloren.

    – Jeff

    24. Mai 2013 um 16:53 Uhr

  • @Jeff: Dieser Code ist nur eine Demonstration. Für Ihren Code sollten Sie den sigaction()-Aufruf irgendwo am Anfang Ihres Programms platzieren und natürlich benötigen Sie auch die Signal-Handler-Funktion. Tun Sie dann alles, was Sie tun, um das SIGTERM normal zu erhalten. An diesem Punkt spuckt Ihr Programm die PID des Absenders aus. Dann überprüfe ps -Af auf diesem Knoten und Sie können genau austricksen, was ihn sendet.

    – Fataler Fehler

    24. Mai 2013 um 17:29 Uhr

  • @FE Als ich Ihren Code zu meinem Programm hinzufügte, erhielt ich diese Kompilierungswarnung: warning: missing braces around initializer. Es lief OK, aber die Nachricht erschien nicht, als ich eine Signal 15-Nachricht erhielt. Funktioniert dies, wenn das Programm im Hintergrund läuft (mit & starten)?

    – Jeff

    25. Mai 2013 um 3:34 Uhr

1397130cookie-checkWas ist “Signal 15 empfangen”

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy