2013-05-23 1 views
22

SUNDIALS/CVODE (숫자 ODE 해결사)라는 라이브러리를 사용하는 C, MPI 프로그램이 Gentoo Linux 클러스터에서 실행되면서 Signal 15 received.이 반복적으로 나타납니다."신호 15 수신"이란 무엇입니까

해당 코드는 MPI, Sundials, Linux, C 또는 누구가 발행 했습니까?

저는 C, MPI, SUNDIALS/CVODE 및 Linux와 같은 초보자입니다.

나는 googling the message과 관련된 것으로 보이는 것이 없습니다. 나는 어디를 봐야할지조차 모른다. (이것은 "무엇이라도 도움이되는"것이 문자 그대로 받아 들여지는 질문 중 하나입니다.)

(크롬 사전이 "googling"이라는 단어를 인식하지 못하는 이유는 무엇입니까?).

+1

신호 15는 대개 'SIGTERM'입니다. 누군가가 당신의 프로그램에 종료하라고 말했습니다. –

답변

39

이것은 리눅스가 SIGTERM을 프로세스에 전달했음을 나타냅니다. 이것은 보통 다른 프로세스 (kill() 경유)의 요청에 따라 이루어 지지만 자신의 프로세스에 의해 (raise()을 사용하여) 보내질 수도 있습니다. 이 신호는 프로세스를 순서대로 종료하도록 요청합니다. 당신은 신호 번호의 빠른 쪽지가 필요한 경우

, bash 쉘을 열고 :

$ 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  

당신은 보낸 사람을 확인할 수 있습니다처럼 적절한 신호 처리기를 사용하여 다음 그

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

공지 사항 신호 처리기에는 exit()에 대한 호출도 포함됩니다. 신호를 무시하여 프로그램을 계속 실행하는 것도 가능하지만 일반적으로 권장하지는 않습니다 (사용자가 프로세스를 종료하면 SIGKILL이 이어질 가능성이 높습니다. 당신은 어떤 정리도 할 수있는 기회를 잃었습니다.)

+0

이 목록은별로 도움이되지 않습니다. 어떤 사람이 저에게 SIGTERM을 보내는 지 어떻게 결정할 수 있습니까? 내가 말할 수있는 유일한 것은 내 코드가 그것을하고 있지 않다는 것이다 (왜냐하면 나는 SIGTERM을 보내는 방법을 모른다). – Jeff

+1

@ Jeff : 보낸 사람의 PIN을 결정하는 데 도움이되는 미리보기로 내 게시물을 업데이트했습니다. 이 코드를 실행하기 위해 코드를 실행하고 다른 쉘에서 "kill "을 실행하여 보낸 사람의 PID를 인쇄합니다. – FatalError

+0

@FatalError (cool name, btw) 코드 주셔서 감사합니다. SIGTERMing 프로세스의 PID를 표시하고 컴파일했습니다. 하지만 어떻게 사용합니까? 내 프로그램을 실행하는 동안 백그라운드에서 실행되는 독립 실행 형 프로그램으로되어 있습니까? 그렇다면 어떻게 그걸 찰거야? 클러스터의 각 노드에서이 프로그램을 실행해야합니까 (oops, 내 프로그램이 클러스터에서 실행되는 것을 잊었습니까?)? 'screen'을 사용한다고 가정하면, 각 화면에서 실행해야합니까? 나도 알아, 많은 질문 있지만, 나는 길을 잃었 어. – Jeff

관련 문제