什么是“收到信号 15”
Posted
技术标签:
【中文标题】什么是“收到信号 15”【英文标题】:What is "Signal 15 received" 【发布时间】:2013-05-19 09:15:00 【问题描述】:什么可能导致使用在 Gentoo Linux 集群上运行的名为 SUNDIALS/CVODE(数值 ODE 求解器)的库的 C、MPI 程序给我重复的 Signal 15 received.
?
该代码是由 MPI、Sundials、Linux、C 还是由谁发布的?
请注意,我几乎是以下技术的初学者:C、MPI、SUNDIALS/CVODE 和 Linux。
我找不到与googling the message 相关的任何内容。我什至不知道从哪里开始寻找。 (这是从字面上理解“任何有帮助”的问题之一。)
(顺便说一句,为什么 Chrome 的字典不能识别“谷歌搜索”这个词?)。
【问题讨论】:
信号 15 通常是SIGTERM
。有人告诉你的程序终止。
【参考方案1】:
这表明 linux 已将SIGTERM
传递给您的进程。这通常是其他进程的请求(通过kill()
),但也可以由您的进程发送给它自己(使用raise()
)。此信号请求有序关闭您的进程。
如果您需要快速的信号编号备忘单,请打开 bash shell 并:
$ 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,并且那么你就失去了进行任何清理的机会)。
【讨论】:
这个列表不是很有帮助。知道如何确定谁在向我发送 SIGTERM 吗?我唯一能说的是我的代码没有这样做(因为我不知道如何发送 SIGTERM)。 @Jeff:我已经用 sn-p 更新了我的帖子,它应该可以帮助您确定发件人的 pid。要查看它的实际效果,您可以运行该代码并从另一个 shell 运行“killscreen
,是否需要在每个屏幕中运行?我知道,有很多问题,但我迷路了。
@Jeff:该代码只是一个演示。对于您的代码,您应该将 sigaction() 调用粘贴在程序开头附近的某个地方,当然您也需要信号处理函数。然后,尽你所能正常获取 SIGTERM。此时,您的程序将吐出发送者的 pid。然后检查该节点上的ps -Af
,您就可以准确了解发送它的内容。
@FE 当我将你的代码添加到我的程序中时,我收到了这个编译警告:warning: missing braces around initializer
。它运行正常,但是当我收到 Signal 15 消息时,该消息没有出现。当程序在后台运行(使用&
启动它)时,这会起作用吗?以上是关于什么是“收到信号 15”的主要内容,如果未能解决你的问题,请参考以下文章