Откуда идет сигнал - PullRequest
       20

Откуда идет сигнал

1 голос
/ 10 ноября 2011

Я запустил сценарий оболочки на сервере Solaris, это очень сложный сценарий, который будет вызывать некоторые другие сценарии оболочки или Perl, и все выполнение занимает много времени - несколько часов.

Странная вещьесть, он всегда выходит ненормально.Я использую команду «truss» для записи системного вызова процесса оболочки.Это указывает на причину появления сигнала № 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 ]

7 голосов
/ 10 ноября 2011

Вы можете легко отследить все сигналы, отправленные вашему процессу, используя скрипт 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);
}
2 голосов
/ 10 ноября 2011

Одна из проблем, связанных с сигналами в качестве метода IPC (межпроцессное взаимодействие), заключается в том, что невозможно выяснить, откуда поступил сигнал. Поскольку вы, вероятно, не видите kill(0, SIGTERM) в выводе truss вы можете предположить, что сигнал не поступает из обработанного процесса.Следовательно, он должен исходить из другого места - либо (возможно, но маловероятно) самой системы, либо (более вероятно) другого процесса.

У меня не работает память - отчасти потому, что я никогда не использовалмеханизм ...

В POSIX существует системный вызов sigaction() с флагом SA_SIGINFO и структурой siginfo_t, определенной в <signal.h>.

Заголовок <signal.h> должен определять тип siginfo_t как структуру, которая должна включать как минимум следующие элементы:

int           si_signo  Signal number. 
int           si_code   Signal code. 
int           si_errno  If non-zero, an errno value associated with 
                        this signal, as described in <errno.h>. 
pid_t         si_pid    Sending process ID. 
uid_t         si_uid    Real user ID of sending process. 
void         *si_addr   Address of faulting instruction. 
int           si_status Exit value or signal. 
long          si_band   Band event for SIGPOLL. 
union sigval  si_value  Signal value.
...