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


15

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

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

#/bin/bash
nohup {SERVERCOMMAND} > currentOutput.log 2>&1 &

less +F currentOutput.log

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

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

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


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


PPS
Я пробовал много вещей (ни один не работал);

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

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

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

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


Кто-то, возможно, сталкивался с моей проблемой; I think it is due to the handling within the database software, not on the shell, Как бы программа сделала это? Как тогда я могу это остановить?
Hashbrown

3
nohupпредотвращает процесс от получения SIGHUPсигнала, тогда как CTRL + C отправляет SIGINTсигнал. Вот почему nohupне дает ожидаемого эффекта.
Петр Доброгост

Ответы:


11

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

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

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

#/bin/bash

setsid {SERVERCOMMAND} > currentOutput.log 2>&1 &
less +F currentOutput.log

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

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


0

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

  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строку в функцию, которая disownsсама по себе, но это должно быть так же, как nohup. Я не думаю, что это SIGHUPпроблема, так как когда я less
удаляю

@Hashbrown Просьба посмотреть мои изменения
MariusMatutiae

Да, я также провел тест, с простым bash-скриптом, вызываемым вместо исполняемого файла {SERVER}. И nohup просто работал нормально. Смотрите мой комментарий по этому вопросу. Я думаю, что это как-то целенаправленно слушает. Так как это собственный сервер (и не очень известный), я даже не могу сказать, что это такое, поэтому кто-то может сказать: «О, это делает Х, тебе нужно сделать Y»
Hashbrown
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.