什么是“收到信号 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 运行“kill ”以查看它打印发件人的 pid。 感谢代码@FatalError(很酷的名字,顺便说一句)。我知道这将向我显示 SIGTERMing 进程的 PID,然后我编译了它。但是我该如何使用它呢?当我运行我的程序时,它应该是在后台运行的独立程序吗?如果是这样,我该如何启动它?我是否需要在集群的每个节点上运行这个程序(哎呀,我忘了提到我的程序正在集群上运行吗?)?假设我使用screen,是否需要在每个屏幕中运行?我知道,有很多问题,但我迷路了。 @Jeff:该代码只是一个演示。对于您的代码,您应该将 sigaction() 调用粘贴在程序开头附近的某个地方,当然您也需要信号处理函数。然后,尽你所能正常获取 SIGTERM。此时,您的程序将吐出发送者的 pid。然后检查该节点上的ps -Af,您就可以准确了解发送它的内容。 @FE 当我将你的代码添加到我的程序中时,我收到了这个编译警告:warning: missing braces around initializer。它运行正常,但是当我收到 Signal 15 消息时,该消息没有出现。当程序在后台运行(使用&amp; 启动它)时,这会起作用吗?

以上是关于什么是“收到信号 15”的主要内容,如果未能解决你的问题,请参考以下文章

什么是模拟信号?什么是数字信号

什么是信号的频谱?周期信号的频谱有什么特点?

什么是E1信号??

模拟信号和数字信号的区别是什么,集成电路

什么是信号槽?深入理解信号槽

Linux信号专题一什么是信号