Встроенная система 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, чтобы выполнить чистое уничтожение?
Как безопасно убить процесс Linux?
Ответы (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
просто убивает (это невозможно поймать).