Ce este „Semnalul 15 primit” (Programare, C, Linux, Mpi, Ode)

Jeff a intrebat.

Ce ar putea cauza un program C, MPI care utilizează o bibliotecă numită SUNDIALS/CVODE (un rezolvator numeric ODE) care rulează pe un cluster Gentoo Linux să-mi dea repetate mesaje de Signal 15 received.?

Codul respectiv este emis de MPI, Sundials, Linux, C sau cine?

Rețineți că sunt destul de începător cu următoarele tehnologii: C, MPI, SUNDIALS/CVODE și Linux.

Nu găsesc nimic care să pară legat de căutarea pe Google a mesajului. Nici măcar nu știu de unde să încep să caut. (Aceasta este una dintre acele întrebări în care „orice ajută” trebuie luată la propriu).

(Ca o paranteză/întrebare secundară, de ce nu recunoaște dicționarul Chrome cuvântul „googling”).

Comentarii

  • Semnalul 15 este de obicei SIGTERM. Cineva a spus programului tău să se încheie. –  > Por Daniel Fischer.
1 răspunsuri
FatalError

Acest lucru indică faptul că linux a livrat o eroare de SIGTERM către procesul tău. Acest lucru se întâmplă de obicei la cererea unui alt proces (prin intermediul kill()), dar ar putea fi trimisă și de către procesul dvs. către el însuși (folosind raise()). Acest semnal solicită o închidere ordonată a procesului dumneavoastră.

Dacă aveți nevoie de o listă rapidă de numere de semnal, deschideți un shell bash și:

$ 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    

Puteți determina expeditorul utilizând un gestionar de semnal adecvat, cum ar fi:

#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
",
      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;
}

Observați că gestionarul de semnal include, de asemenea, un apel la exit(). De asemenea, este posibil ca programul dvs. să continue să se execute ignorând semnalul, dar acest lucru nu este recomandat în general (dacă este un utilizator care face acest lucru, există o mare probabilitate ca acesta să fie urmat de un SIGKILL dacă procesul dvs. nu iese, iar dvs. ați pierdut ocazia de a face curățenie în acel moment).

Comentarii

  • Această listă nu este foarte utilă. Aveți vreo idee cum pot determina cine îmi trimite SIGTERM-ul? Singurul lucru pe care îl pot spune este că nu codul meu o face (pentru că nu știu cum să trimit un SIGTERM). –  > Por Jeff.
  • @Jeff: Mi-am actualizat postarea cu un fragment care ar trebui să vă ajute să determinați pid-ul expeditorului. Pentru a-l vedea în acțiune, puteți rula acest cod și, dintr-un alt shell, să rulați „kill <pid>” pentru a vedea cum imprimă pid-ul expeditorului. –  > Por FatalError.
  • Mulțumesc pentru cod @FatalError (nume mișto, btw). Am înțeles că acest lucru îmi va arăta PID-ul procesului SIGTERMing și l-am compilat. Dar cum îl folosesc? Ar trebui să fie un program de sine stătător care rulează în fundal în timp ce eu îmi execut programul? Dacă da, cum îl pornesc? Trebuie să execut acest program pe fiecare nod al clusterului (ups, am uitat să menționez că programul meu rulează pe un cluster?)? Să presupunem că folosesc screen, trebuie să ruleze în fiecare ecran? Știu, multe întrebări, dar sunt pierdut. –  > Por Jeff.
  • @Jeff: Acest cod este doar o demonstrație. Pentru codul tău, ar trebui să lipești apelul sigaction() undeva aproape de începutul programului și, bineînțeles, vei avea nevoie și de funcția de gestionare a semnalului. Apoi, faceți tot ceea ce faceți pentru a obține SIGTERM-ul în mod normal. În acest moment, programul dvs. vă va spune pid-ul celui care l-a trimis. Apoi verificați ps -Af pe acel nod și puteți să înșelați exact cine îl trimite. –  > Por FatalError.
  • @FE Când am adăugat codul tău în programul meu, am primit acest avertisment de compilare: warning: missing braces around initializer. A rulat OK, dar mesajul nu a apărut când am primit un mesaj de semnal 15. Va funcționa acest lucru atunci când programul rulează în fundal (utilizând & pentru a-l lansa)? –  > Por Jeff.

Tags:, , ,