Ctrl + c в подпроцессе убивает процесс nohup'ed ранее в скрипте

4196
Hashbrown

Я не знал, относится ли это к SO (поскольку это ошибка кодирования), но подумал, что вы, ребята, лучше разберетесь в тонкостях используемого программного обеспечения (так что, возможно, даже U & L можно рассмотреть).

Вот минимальный код скрипта (см. Правки для полного скрипта, есть причина, по которой я так делаю);

#/bin/bash nohup > currentOutput.log 2>&1 &  less +F currentOutput.log 

Он пытается запустить сервер в фоновом режиме, который выводит файл журнала.
Тогда я followэтот файл журнала с помощью less +F. Как вы делаете, чтобы выйти, вы должны нажать ctrl+, cпрежде чем вы можете нажать Q.

Что происходит, когда я ctrl+ cвнутри lessкоманды (чтобы остановить tailing), это как-то убивает сервер, с которого начинали nohupсверху! Ничто другое не влияет. Я могу shift+, fчтобы снова начать следить за журналом (который не получает никакой новой информации, так как сервер убит), и, если я нажму, Qостальная часть сценария выполняется нормально.

Вы знаете, почему это происходит? Как избежать этого / что-то еще, что я должен использовать?


PS
Серверная программа может прослушивать ^C, что может быть проблемой; что я могу сделать, чтобы остановить это? Например, когда я просто запускаю сам по себе (в режиме блокировки), я могу нажать ctrl+ c, что не сразу его убивает; это печатает Received ^C signal, shutting down(и затем убивает себя). Это то, что происходит, когда я ^Cв less(Финал Received ^C signal, shutting downзаписывается в журнал).


PPS
Я пробовал несколько вещей (ни одна не работала);

  • пытаясь отключить стандартный ввод от сценария, изменив

    nohup > currentOutput.log 2>&1 & to nohup echo '' | > currentOutput.log 2>&1 & or nohup cat /dev/null/ | > currentOutput.log 2>&1 & 
  • использовать stty intr ^Gдля замены команды прерывания, но затем ctrl+ gсделал именно то, что ^Cделал в любом случае (так что это может быть проблемой с моим эмулятором терминала; konsole)

  • поместив строку nohup& / или lessв скобки (чтобы сделать ее подоболочкой)

  • запуск сценария xtermвместоkonsole

13
Кто-то, возможно, [наткнулся] (http://www.linuxquestions.org/questions/programming-9/ignore-disable-ctrl-c-sigint-in-a-shell-script-780188/) на мою проблему; «Я думаю, что это связано с обработкой в ​​программном обеспечении базы данных, а не в оболочке». Как бы программа сделала это? Как тогда я могу это остановить? Hashbrown 10 лет назад 0
nohup запрещает процессу принимать сигнал SIGHUP, тогда как CTRL + C отправляет сигнал SIGINT. Вот почему `nohup` не имеет ожидаемого эффекта. Piotr Dobrogost 9 лет назад 3

2 ответа на вопрос

9
Hashbrown

Я был прав, думая, что это было SIGINTотправлено во все процессы, когда ctrl+ c, но я был глуп, думая, что создание другого процесса выведет его за пределы process group(см. Мои попытки в P.P.S.).

Это не только точный вариант использования, но и правильное решение.

Из-за того, как мой сценарий был структурирован, ответ там не подходил дословно, теперь этот сценарий;

#/bin/bash  setsid > currentOutput.log 2>&1 & less +F currentOutput.log 

Сервер продолжает вывод в файл журнала после I ctrl+ cin less.

Спасибо за все время.

0
MariusMatutiae

Вы пытались отречься ?

 disown -h %1 

или какова твоя работа; disown - встроенная оболочка, ее страница руководства гласит:

отрекаться

отречься [-ar] [-h] [спецификация работы ...]

Без параметров каждая спецификация заданий удаляется из таблицы активных заданий. Если опция -h' option is given, the job is not removed from the table, but is marked so that SIGHUP is not sent to the job if the shell receives a SIGHUP. If jobspec is not present, and neither the-a 'nor -r' option is supplied, the current job is used. If no jobspec is supplied, the-a' означает удалить или отметить все задания; опция `-r 'без аргумента jobspec ограничивает выполнение операций заданиями.

РЕДАКТИРОВАТЬ

Забавно, ваша конструкция работает на моем Arch Linux:

 $ cat testm #!/bin/sh  nohup /home/mario/temp/waste &   less +F out.log  $ cat waste #!/bin/sh  while [ 1 ]; do find / -print 2>1 1> out.log done $ ./testm nohup: appending output to ‘nohup.out’ $ ps ax | grep waste 19090 pts/2 S 0:00 /bin/sh /home/mario/temp/waste 19124 pts/2 S+ 0:00 grep waste] $ 

Перед командой ps мне пришлось прокрутить файл out.log, затем Ctrl+C, потом q.

да, но я не знаю, как это применить. Я попытался поместить строку `nohup` в функцию, которая сама` отрекается ', но она должна быть такой же, как `nohup`. Я не думаю, что это проблема `SIGHUP`, так как когда я удаляю строку` less`, сценарий завершается, когда сервер все еще работает Hashbrown 10 лет назад 0
@ Hashbrown, пожалуйста, смотрите мое редактирование MariusMatutiae 10 лет назад 0
Да, я также провел тест, с простым bash-скриптом, вызываемым вместо исполняемого файла . И nohup просто работал нормально. Смотрите мой комментарий по этому вопросу. Я думаю, что это как-то целенаправленно слушает. Поскольку это собственный (и не очень известный) сервер, я даже не могу сказать, что это такое, поэтому кто-то может сказать: «О, это делает Х, тебе нужно сделать Y» Hashbrown 10 лет назад 0

Похожие вопросы