来自哪里的信号

时间:2011-11-10 03:27:25

标签: shell unix solaris signals

我在solaris服务器上运行了一个shell脚本,这是一个非常复杂的脚本,可以调用其他一些shell或perl脚本,整个执行成本很长 - 几个小时。

奇怪的是,它总是异常退出。我用“truss”命令记录shell进程的系统调用。它表明原因似乎是信号#15 SIGTERM的到来。但我不知道#15来自哪里?有什么方法可以检测出来自哪个过程的信号?

我的服务器信息:

uname -a
SunOS zsups379 5.10 Generic_144488-07 sun4u sparc SUNW,Sun-Fire-880

桁架输出切片(23528是主要过程,25213是23528的子过程):

25213/2:        read(8, "17A6 G8A078A 58E15 P9E 5".., 8192)     = 8192

25213/1:            Received signal #15, SIGTERM, in lwp_wait() [caught]

23528:      Received signal #15, SIGTERM, in waitid() [caught]

25213/2:        write(9, " X #85 f @F5 Z88CAFB J\n".., 515)     = 515

23528:  waitid(P_ALL, 0, 0xFFBFD958, WEXITED|WTRAPPED|WSTOPPED|WCONTINUED) Err#91 ERESTART

25213/1:        lwp_wait(2, 0xFFBFD39C)                         Err#91 ERESTART

25213/1:        lwp_sigmask(SIG_SETMASK, 0xFFBFFEFF, 0x0000FFF7) = 0xFFBFFEFF [0x0000FFFF]

23528:  lwp_sigmask(SIG_SETMASK, 0x00004000, 0x00000000) = 0xFFBFFEFF [0x0000FFFF]
....

2 个答案:

答案 0 :(得分:7)

您可以使用类似于该脚本的dtrace脚本轻松跟踪发送到您的进程的所有信号:

proc:::signal-send
/ args[2] == 15 /
{
    printf("Process %d (%s) killing %d (%s)\n",
            pid, execname, args[1]->pr_pid, args[1]->pr_fname);
}

答案 1 :(得分:2)

信号作为IPC(进程间通信)方法的一个问题是无法找出信号来自何处。因为你可能没有看到{在kill(0, SIGTERM)输出中{1}},您可以假设信号不是来自桁架过程。因此,它必须来自其他地方 - 或许(可能,但不太可能)系统本身,或(更可能)另一个过程。

我的记忆力下降了 - 部分是因为我从未使用过这种机制......

POSIX中有sigaction()系统调用,truss标记和<signal.h>中定义的SA_SIGINFO结构。

  

siginfo_t标题应将<signal.h>类型定义为结构,其中至少应包括以下成员:

siginfo_t