Кілька моїх звичайних програм виходять з ладу (регулярно) з повідомленням "Сигнал, визначений користувачем 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".