Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

linux: узнать, кто послал сигнал

1.8K
12 августа 2010 года
igor_nf
256 / / 13.12.2006
Конкретная проблема.

Есть сервер saslauthd. После запуска через некоторое время падает беспричинно, в логах даже в дебуг-режиме ничего вразумительного не пишет, что-то типа "server_exit: master exited...". Пробовал отследить причину падения при помощи strace - результат таков: падает при получении SIGTERM. При запуске saslauthd создаёт несколько дочерних процессов, один из процессов, таким образом, остаётся мастером над дочерними, дочерние получают по очереди SIGTERM, мастер получает, вследствии этого, SIGCHILD. Проблему нужно решить в любом случае, осталось узнать, кто шлёт SIGTERM и почему. Нагуглил по проблеме системный вызов ptrace с request = PTRACE_GETSIGINFO, но пока с трудом понимаю, поможет ли мне это в данном случае.. Может есть другие пути решения проблемы, кто что подскажет ?
2
13 августа 2010 года
squirL
5.6K / / 13.08.2003
Цитата: igor_nf
Нагуглил по проблеме системный вызов ptrace с request = PTRACE_GETSIGINFO, но пока с трудом понимаю, поможет ли мне это в данном случае..


не поможет.

как админ - я бы копал все cron скрипты и другие возможные планировщики задач, системные лимиты, установил бы уровень журналирования по максимуму (обычно все приложения позволяют его менять, не думаю, что saslauthd отличается).

как программист - нашел бы в коде обработчик сигналов и пропатчил - затребовал выдавать мне PID процесса "убийцы".
делается это как то так:

Код:
#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;
}
1.8K
13 августа 2010 года
igor_nf
256 / / 13.12.2006
Короче, мне больше нравится второй вариант, о нём то я и не подумал. Так и буду пробовать. Гемморой, но решать нужно. Карма не плюсуется.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог