2013-05-23 12 views
22

Co może spowodować program C, MPI korzystający z biblioteki o nazwie SUNDIALS/CVODE (numeryczny solver ODE) działającej w klastrze Gentoo Linux, aby dać mi powtórzenie Signal 15 received.?Co to jest "Signal 15 received"

Czy ten kod jest wydawany przez MPI, zegar słoneczny, system Linux, C lub kto?

Zauważ, że jestem początkującym użytkownikiem następujących technologii: C, MPI, SUNDIALS/CVODE i Linux.

Nie mogę znaleźć niczego, co wydaje się być powiązane z googling the message. Nie wiem nawet, gdzie zacząć wyglądać. (Jest to jedno z tych pytań, w których "cokolwiek pomaga" należy traktować dosłownie.)

(Czy odłożenie na bok/dlaczego, dlaczego słownik Chrome nie rozpoznaje słowa "googling"?).

+1

Sygnał 15 jest zwykle "SIGTERM". Ktoś powiedział programowi, żeby się wypowiedział. –

Odpowiedz

39

Oznacza to, że linux dostarczył procesowi SIGTERM. Zazwyczaj jest to na życzenie innego procesu (poprzez kill()), ale może być również wysyłane przez proces do samego siebie (przy użyciu raise()). Ten sygnał wymaga uporządkowanego zamknięcia procesu.

Jeśli potrzebujesz szybkiej Cheatsheet numerów sygnału, otworzyć powłoki bash oraz:

$ 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  

Można określić nadawcę za pomocą odpowiedniego uchwytu sygnału jak:

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

zauważyć, że obsługa sygnału obejmuje także wywołanie exit(). Możliwe jest również kontynuowanie wykonywania programu przez zignorowanie sygnału, ale nie jest to zalecane w ogóle (jeśli jest to robiąc to istnieje duża szansa, że ​​po nim nastąpi SIGKILL, jeśli proces nie zostanie zakończony, i utraciłeś okazję do zrobienia wszelkich porządków).

+0

Ta lista nie jest zbyt pomocna. Masz pomysł, jak ustalić, kto wysyła mi SIGTERM? Jedyne, co mogę powiedzieć to, że mój kod nie robi tego (ponieważ nie wiem, jak wysłać SIGTERM). – Jeff

+1

@Jeff: Zaktualizowałem swój post za pomocą urywka, który powinien pomóc ci określić pid tego nadawcy. Aby zobaczyć go w akcji, możesz uruchomić ten kod i uruchomić inny program "kill ", aby zobaczyć, jak drukować pidera nadawcy. – FatalError

+0

Dzięki za kod @ FatalError (fajna nazwa, btw). Rozumiem, że to pokaże mi PID procesu SIGTERMing i skompilowałem go. Ale jak z niego korzystać? Czy ma to być samodzielny program działający w tle, gdy uruchamiam program? Jeśli tak, to jak mogę to zrobić? Czy muszę uruchomić ten program na każdym węźle klastra (oops, czy zapomniałem wspomnieć, że mój program działa w klastrze?)? Załóżmy, że używam 'screen', czy musi działać na każdym ekranie? Wiem, dużo pytań, ale jestem zgubiony. – Jeff