Обработчик сигнала SIGTERM не печатает на консоль - PullRequest
0 голосов
/ 18 октября 2019

Я пытаюсь поймать сигнал SIGTERM и распечатать сообщение в обработчике от демона Linux:

void SigStop_Handler(int sig)
{
   D(printf("****************** HANDLED STOP SIGNAL ******************\n"));
   printf("\n");
}

int main(int argc, char *argv[])
{
   signal(SIGTERM, SigStop_Handler);

   while(true)
   {
      //do something
   }

   return 0;    
}

Программа работает как демон, запущенный из командной строки:

systemctl start abc

Демон будет остановлен:

systemctl stop abc

Когда демон останавливается, я ожидал, что сообщение будет напечатано на консоли. Однако сообщение не распечатывается, и командная строка не возвращается к командной строке. Это возвращается через некоторое время (тайм-аут). Демон будет остановлен, но сообщение не будет напечатано.

Что я делаю не так?

1 Ответ

0 голосов
/ 18 октября 2019

Два вопроса: завершение работы демона при получении сигнала и получение сообщения.

В контексте systemctl вы хотите, чтобы ваш обработчик сигнала вышел из программы. В противном случае, он просто «распечатает» сообщение и возобновит обработку. Попробуйте

void SigStop_Handler(int sig)
{
   D(fprintf(stderr, "****************** HANDLED STOP SIGNAL ******************\n"));
   printf("\n");
   exit(sig+128) ;
}

Также, учитывая, что процесс запущен как демон, stdout не будет подключен к терминалу. Вместо этого он будет перенаправлен в файл журнала. Также предлагается использовать stderr для отправки сообщений вместо stdout (см. Код выше). Также обратите внимание на записи конфигурации StandardOutput и StandardErrro для вашей службы.

Задержка, которую вы наблюдаете в настоящее время, происходит из-за того, что 'systemctl' ждет несколько секунд после отправки сигнала TERM - давая демону изменение для завершения. ,Если демон не завершает свою работу добровольно, будет отправлен сигнал KILL, который заставит демона безоговорочно завершиться немедленно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...