2013-05-23 21 views
22

Cosa potrebbe causare un programma C, MPI utilizzando una libreria denominata SUNDIALS/CVODE (un risolutore ODE numerico) in esecuzione su un cluster Gentoo Linux per darmi ripetutamente Signal 15 received.?Che cos'è "Segnale 15 ricevuto"

Il codice viene emesso da MPI, Sundials, Linux, C o chi?

Nota che sono praticamente un principiante con le seguenti tecnologie: C, MPI, SUNDIALS/CVODE e Linux.

Non riesco a trovare nulla che sembra correlato da googling the message. Non so nemmeno da dove cominciare a guardare. (Questa è una di quelle domande in cui "qualsiasi cosa aiuta" deve essere presa letteralmente.)

(Come un ripensamento/ripensamento perché il dizionario di Chrome non riconosce la parola "googling"?).

+1

Il segnale 15 è in genere 'SIGTERM'. Qualcuno ha detto al tuo programma di terminare. –

risposta

39

Ciò indica che linux ha consegnato uno SIGTERM al processo. Questo di solito è richiesto da qualche altro processo (tramite kill()) ma potrebbe anche essere inviato dal processo a se stesso (utilizzando raise()). Questo segnale richiede un arresto regolare del processo.

Se avete bisogno di un rapido bigino di numeri di segnale, aprire una shell bash e:

$ 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  

è possibile determinare il mittente utilizzando un gestore di segnale appropriata come:

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

Si noti che il il gestore di segnale include anche una chiamata a exit(). È anche possibile che il tuo programma continui ad essere eseguito ignorando il segnale, ma questo non è raccomandato in generale (se è un utente che lo fa ci sono buone probabilità che sia seguito da un SIGKILL se il tuo processo non esce, e hai perso l'opportunità di fare qualsiasi pulizia quindi).

+0

Questa lista non è molto utile. Qualche idea su come posso determinare chi mi sta mandando il SIGTERM? L'unica cosa che posso dire è che il mio codice non lo sta facendo (perché non so come inviare un SIGTERM). – Jeff

+1

@Jeff: ho aggiornato il mio post con uno snippet che dovrebbe aiutare a determinare il pid del mittente. Per vederlo in azione è possibile eseguire quel codice e da un'altra shell eseguire "kill " per vederlo stampare il pid del mittente. – FatalError

+0

Grazie per il codice @FatalError (cool name, btw). Ho capito che questo mi mostrerà il PID del processo SIGTERMing e l'ho compilato. Ma come lo uso? Dovrebbe essere un programma standalone in esecuzione in background mentre eseguo il mio programma? Se è così, come posso dargli il calcio d'inizio? Devo eseguire questo programma su ciascun nodo del cluster (oops, ho dimenticato di menzionare che il mio programma è in esecuzione su un cluster?)? Supponiamo che io stia usando 'screen', deve essere eseguito in ogni schermata? Lo so, molte domande, ma sono perso. – Jeff

Problemi correlati