#include <stdio.h>
#include <signal.h>
#include <string.h>
#include <unistd.h>
struct sigaction act;
void sighandler(int signum, siginfo_t *info, void *ptr){
printf("Received signal: %d\n", signum);
printf("Signal from PID: %lu\n", (unsigned long) info->si_pid);
}
int main () {
printf("my PID %lu\n", (unsigned long)getpid());
memset(&act, 0, sizeof(act));
act.sa_sigaction = sighandler;
act.sa_flags = SA_SIGINFO;
sigaction(SIGTERM, &act, NULL);
for (;;) {
sleep(100);
}
return 0;
}
linux: узнать, кто послал сигнал
Есть сервер saslauthd. После запуска через некоторое время падает беспричинно, в логах даже в дебуг-режиме ничего вразумительного не пишет, что-то типа "server_exit: master exited...". Пробовал отследить причину падения при помощи strace - результат таков: падает при получении SIGTERM. При запуске saslauthd создаёт несколько дочерних процессов, один из процессов, таким образом, остаётся мастером над дочерними, дочерние получают по очереди SIGTERM, мастер получает, вследствии этого, SIGCHILD. Проблему нужно решить в любом случае, осталось узнать, кто шлёт SIGTERM и почему. Нагуглил по проблеме системный вызов ptrace с request = PTRACE_GETSIGINFO, но пока с трудом понимаю, поможет ли мне это в данном случае.. Может есть другие пути решения проблемы, кто что подскажет ?
Цитата: igor_nf
Нагуглил по проблеме системный вызов ptrace с request = PTRACE_GETSIGINFO, но пока с трудом понимаю, поможет ли мне это в данном случае..
не поможет.
как админ - я бы копал все cron скрипты и другие возможные планировщики задач, системные лимиты, установил бы уровень журналирования по максимуму (обычно все приложения позволяют его менять, не думаю, что saslauthd отличается).
как программист - нашел бы в коде обработчик сигналов и пропатчил - затребовал выдавать мне PID процесса "убийцы".
делается это как то так:
Код:
Короче, мне больше нравится второй вариант, о нём то я и не подумал. Так и буду пробовать. Гемморой, но решать нужно. Карма не плюсуется.