Нет nohup, есть команда nousr1?

12

Некоторые из моих обычных программ аварийно завершают работу (регулярно) с сообщением «Пользовательский сигнал 1». Я знаю, что есть nohupкоманда, но есть ли nousr1команда? Или что-то подобное, nohupно с USR1?

user2624632
источник
3
Лучший вопрос может быть в том, что отправляет ему сигнал usr1? Если ничего не происходит, сообщение о выходе может просто ввести в заблуждение.
Грант
2
Похоже, у вас могут быть серьезные проблемы с вашими «обычными программами» ... простое отключение сигналов может не исправить или не позволить соответствующим приложениям работать должным образом. Я настоятельно рекомендую вам внимательно изучить свое окружение, прежде чем просто отключить вещи.
MDPC
@Grant: я согласен. Есть ли утилита, которая может сказать мне, что посылает эти сигналы?
user2624632

Ответы:

3

Простое хакерское решение иметь утилиту, аналогичную 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в первую очередь. То, что он также устанавливает обработчик сигнала, является дополнительным бонусом, но это не нужно.
Саймон Рихтер
@SimonRichter Если вы удалите signal(SIGHUP,SIG_IGN);вызов nohup.c, процесс получит SIGHUP. Что nohupделает в стороне от игнорирования сигнала только повторное открытие STDIN, STDOUT, STDERR дескрипторов как нетерминальные файлы. Это на самом деле не отсоединяет процесс от терминала каким-либо особым образом. Т.е. процесс будет отправлен, SIGHUPкогда терминал зависнет. С другой стороны, есть bash, который делает то же самое с disownкомандой, но я не уверен, как она реализована - возможно, так, как вы имеете в виду.
Руслан
Кажется, это хорошо работает.
user2624632
8

Как насчет trapвстроенной команды оболочки ?

trap 'echo "Thou shalt not USR1 me"' USR1 
Янне Пиккарайнен
источник
Хорошая идея, но это не сработало. Процесс завершился в любом случае с «Определяемым пользователем сигналом 1».
user2624632
Обработчики сигналов (кроме SIG_IGN и SIG_DFL) не наследуются дочерними процессами.
Aecolley
2

Вам нужно использовать форму trapкоманды с пустым аргументом. Попробуй это:

trap '' SIGUSR1; myprogram

Это будет игнорировать сигнал SIGUSR1, который вы пытаетесь сделать. Хотя я согласен с комментаторами, что здесь, вероятно, происходит больше, чем кажется на первый взгляд.

Неверная форма:

trap 'echo ...' SIGUSR1; myprogram

по- прежнему позволит myprogramполучить SIGUSR1 но оболочка будет выполнить команду echoиз trapкоманды.

Адриан Пронк
источник
Кажется, это хорошо работает.
user2624632
К сожалению, я говорил слишком рано. Я бежал, trap '' SIGUSR1; gvimdiff file1 file2и Вим умер с "Vim: поймал смертельный сигнал USR1".
user2624632
Хммм, глядя на исходный код на code.google.com/p/vim/source/browse/src/os_unix.c, кажется, что VIM повторно включает сигнал USR1 и рассматривает его как фатальную ошибку. Казалось бы, ваша единственная надежда - заставить ОС отказаться от доставки сигнала USR1. Я не знаю, есть ли что-то, что может обеспечить такую ​​функциональность.
Адриан Пронк
Более подробная информация здесь: stackoverflow.com/q/4515274/41861
Адриан Пронк
Адриан Пронк: это не просто Вим; это также Firefox, и Aqualung, и Thunderbird, и некоторые другие. Но не другие приложения, такие как Konsole, который работает вечно.
user2624632