Как безопасно убить процесс Linux?

Встроенная система Linux, которая непрерывно записывает файлы (~ 1 / с) в раздел FAT32, иногда повреждает раздел при прерывании. Процесс можно прервать двумя способами: выключением и использованием musb_hdrc / gadget для копирования файлов на хост и с хоста через USB. Musb_hdrc / gadget используется для переключения доступа к разделу с внутреннего встроенного управления на USB для передачи файлов на внешний хост и с него. Решением может быть killall process-name, но убьет ли это процесс Linux? IOW: завершит ли процесс какой-либо файл IO, который уже был запущен, или все еще будут поврежденные разделы? Согласно странице руководства killall If no signal name is specified SIGTERM is sent. Нужно ли что-то добавить в код, чтобы убедиться, что убийство является чистым и / или есть специальное имя сигнала killall, чтобы выполнить чистое уничтожение?


person jacknad    schedule 28.01.2013    source источник


Ответы (3)


Что ж, вы можете изменить свое приложение, чтобы улавливать любой сигнал, кроме SIGKILL.
Операцию выключения или очистку можно выполнить в обработчике сигналов.
Вот простой пример настройки обработчика для удаления временных файлов при возникновении определенных фатальных сигналов. :

#include <signal.h>

 void
 termination_handler (int signum)
 {
   printf ("Caught signal %d\n", sig);
   switch(signum)
   {
       case SIGINT:
       printf ("CTRL C not allowed\n");
       break;

       case SIGTERM:
       struct temp_file *p;
       for (p = temp_file_list; p; p = p->next)
           unlink (p->name);
       exit(1);
       break;

       default:
   ...
   }
 }

 int
 main (void)
 {
   ...
   if (signal (SIGINT, termination_handler) == SIG_IGN)
     signal (SIGINT, SIG_IGN);
   if (signal (SIGHUP, termination_handler) == SIG_IGN)
     signal (SIGHUP, SIG_IGN);
   if (signal (SIGTERM, termination_handler) == SIG_IGN)
     signal (SIGTERM, SIG_IGN);
   ...
 }

Код после обработчика сигнала не будет выполняться в случае SIGTERM.

person raj_gt1    schedule 28.01.2013
comment
Добавил что-то похожее на ваш пример в свой код. Бесконечно благодарен. - person jacknad; 29.01.2013

Если код хорошо написан, процесс должен уловить SIGTERM, полностью остановить то, что он делает, и полностью закрыть все открытые ресурсы.

Если вы не можете изменить код, и вы уже заметили, что сигнал SIGTERM жестко останавливает процесс (как и SIGKILL), я думаю, вы ничего не можете сделать, чтобы остановить его.

person Davide Berra    schedule 28.01.2013

По модулю ошибок повреждение раздела (и файловой системы) невозможно в результате остановки процесса, который выполняет обычный файловый ввод-вывод (т.е.не работает с разделом как устройством, манипулируя необработанными блоками).

Если процесс не заботится об обработке или игнорировании сигналов, SIGTERM убьет его так же безжалостно, как и SIGKILL. Для процессов, которые на самом деле пытаются корректно завершить работу по сигналам, SIGTERM означает завершите работу, а SIGKILL просто убивает (это невозможно поймать).

person Anton Kovalenko    schedule 28.01.2013