Как безопасно убить процесс Linux?
Встроенная система Linux, которая непрерывно записывает файлы (~1/s) в раздел 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 для выполнения чистого уничтожения?
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.
Если код хорошо написан, процесс должен поймать SIGTERM
и полностью прекратите то, что он делает, и аккуратно закройте каждый открытый ресурс.
Если вы не можете изменить код, и вы уже заметили, что SIGTERM
сигнал жестоко останавливает процесс (так же, как SIGKILL
), я думаю, вы ничего не можете сделать, чтобы остановить это красиво.
В случае ошибок по модулю, повреждение раздела (и файловой системы) невозможно вследствие уничтожения процесса, который выполняет обычный файловый ввод-вывод (т.е. не работает с разделом как устройством, манипулируя необработанными блоками).
Если процесс не хочет обрабатывать или игнорировать сигналы, SIGTERM
убьет его так же, как беспощадно SIGKILL
было бы. Для процессов, которые на самом деле пытаются изящно выйти по сигналам, SIGTERM
значит не могли бы вы закрытьSIGKILL
просто убивает (это невозможно поймать).