Є nohup, чи є команда nousr1?


12

Кілька моїх звичайних програм виходять з ладу (регулярно) з повідомленням "Сигнал, визначений користувачем 1". Я знаю, що є nohupкоманда, але чи є nousr1команда? Або щось, що буде робити щось на кшталт, nohupале не з USR1?


3
Кращим питанням може бути те, що в першу чергу передає йому сигнал usr1? Якщо нічого не відбувається, повідомлення про вихід може бути просто оманливим.
Грант

2
Схоже, у вас можуть виникнути серйозні проблеми у ваших "звичайних програмах" ... просто відключення сигналів може не виправити або забезпечити належне функціонування базових програм. Я настійно пропоную вам уважно вивчити своє оточення, перш ніж вимкнути речі.
mdpc

@Grant: Я згоден. Чи є утиліта, яка може сказати мені, що надсилає ці сигнали?
користувач2624632

Відповіді:


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командою, але я не впевнений, як це реалізовано - можливо, так, як ви маєте на увазі.
Руслан

Це, здається, працює добре.
користувач2624632

8

Як щодо trapвбудованої команди оболонки ?

trap 'echo "Thou shalt not USR1 me"' USR1 

Гарна ідея, але вона не спрацювала. Процес все одно закінчувався із "Сигналом, визначеним користувачем 1".
користувач2624632

Обробники сигналів (крім SIG_IGN та SIG_DFL) не успадковуються дочірніми процесами.
aecolley

2

Потрібно використовувати форму trapкоманди з порожнім аргументом. Спробуйте це:

trap '' SIGUSR1; myprogram

Це ігнорує сигнал SIGUSR1, що саме ви намагаєтесь зробити. Хоча я згоден з коментаторами, що тут, мабуть, відбувається більше, ніж очі.

Неправильна форма:

trap 'echo ...' SIGUSR1; myprogram

по- , як і раніше дозволить myprogramотримати SIGUSR1 але оболонка буде виконати команду echoз trapкоманди.


Це, здається, працює добре.
користувач2624632

На жаль, я заговорив занадто рано. Я бігав, trap '' SIGUSR1; gvimdiff file1 file2і Вім помер з "Vim: Зловив смертельний сигнал USR1".
користувач2624632

Гммм, дивлячись на вихідний код за адресою code.google.com/p/vim/source/browse/src/os_unix.c, схоже, що VIM знову вмикає сигнал USR1 і трактує його як фатальну помилку. Вашою єдиною надією може здатися, якщо ви зможете змусити ОС відмовитись від доставки сигналу USR1. Я не знаю, чи є щось там, що може забезпечити цю функціональність.
Адріан Пронк

Більше інформації тут: stackoverflow.com/q/4515274/41861
Адріан Пронк

Адріан Пронк: це не просто Вім; це також Firefox, і Aqualung, і Thunderbird, і деякі інші. Але не інші додатки, такі як Konsole, які працюють назавжди.
користувач2624632
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.