Ctrl + c в подпроцессе убивает процесс nohup'ed ранее в скрипте
4229
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 Я пробовал несколько вещей (ни одна не работала);
пытаясь отключить стандартный ввод от сценария, изменив
использовать stty intr ^Gдля замены команды прерывания, но затем ctrl+ gсделал именно то, что ^Cделал в любом случае (так что это может быть проблемой с моим эмулятором терминала; konsole)
поместив строку nohup& / или lessв скобки (чтобы сделать ее подоболочкой)
запуск сценария xtermвместоkonsole
Кто-то, возможно, [наткнулся] (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:
Перед командой ps мне пришлось прокрутить файл out.log, затем Ctrl+C, потом q.
да, но я не знаю, как это применить. Я попытался поместить строку `nohup` в функцию, которая сама` отрекается ', но она должна быть такой же, как `nohup`. Я не думаю, что это проблема `SIGHUP`, так как когда я удаляю строку` less`, сценарий завершается, когда сервер все еще работает
Hashbrown 10 лет назад
0
@ Hashbrown, пожалуйста, смотрите мое редактирование
MariusMatutiae 10 лет назад
0
Да, я также провел тест, с простым bash-скриптом, вызываемым вместо исполняемого файла . И nohup просто работал нормально. Смотрите мой комментарий по этому вопросу. Я думаю, что это как-то целенаправленно слушает. Поскольку это собственный (и не очень известный) сервер, я даже не могу сказать, что это такое, поэтому кто-то может сказать: «О, это делает Х, тебе нужно сделать Y»
Hashbrown 10 лет назад
0