Некоторые из моих обычных программ аварийно завершают работу (регулярно) с сообщением «Пользовательский сигнал 1». Я знаю, что есть nohupкоманда, но есть ли nousr1команда? Или что-то подобное, nohupно с USR1?
Некоторые из моих обычных программ аварийно завершают работу (регулярно) с сообщением «Пользовательский сигнал 1». Я знаю, что есть nohupкоманда, но есть ли nousr1команда? Или что-то подобное, nohupно с USR1?
Ответы:
Простое хакерское решение иметь утилиту, аналогичную nohup, но для SIGUSR1, было бы получить копию исходного кода coreutils , распаковать ее, сделать
sed -i 's/SIGHUP/SIGUSR1/' /path/to/coreutils/src/nohup.c
также можно изменить имя выходного файла
sed -i 's/nohup\.out/nousr1.out/g' /path/to/coreutils/src/nohup.c
, скомпилируйте этот источник и установите заново скомпилированный nohupбинарный файл /usr/bin/nousr1:
cp /path/to/coreutils/src/nohup /usr/bin/nousr1
После этого, как я проверил, sleep 1000выходит USR1, пока nousr1 sleep 1000не застрахован от этого сигнала.
nohupКстати, основная функциональность заключается в том, чтобы отсоединить процесс от терминала, чтобы он не отправлялся SIGHUPв первую очередь. То, что он также устанавливает обработчик сигнала, является дополнительным бонусом, но это не нужно.
signal(SIGHUP,SIG_IGN);вызов nohup.c, процесс получит SIGHUP. Что nohupделает в стороне от игнорирования сигнала только повторное открытие STDIN, STDOUT, STDERR дескрипторов как нетерминальные файлы. Это на самом деле не отсоединяет процесс от терминала каким-либо особым образом. Т.е. процесс будет отправлен, SIGHUPкогда терминал зависнет. С другой стороны, есть bash, который делает то же самое с disownкомандой, но я не уверен, как она реализована - возможно, так, как вы имеете в виду.
Как насчет trapвстроенной команды оболочки ?
trap 'echo "Thou shalt not USR1 me"' USR1
Вам нужно использовать форму trapкоманды с пустым аргументом. Попробуй это:
trap '' SIGUSR1; myprogram
Это будет игнорировать сигнал SIGUSR1, который вы пытаетесь сделать. Хотя я согласен с комментаторами, что здесь, вероятно, происходит больше, чем кажется на первый взгляд.
Неверная форма:
trap 'echo ...' SIGUSR1; myprogram
по- прежнему позволит myprogramполучить SIGUSR1 но оболочка будет выполнить команду echoиз trapкоманды.
trap '' SIGUSR1; gvimdiff file1 file2и Вим умер с "Vim: поймал смертельный сигнал USR1".