Я не знал, относится ли это к 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
, Как бы программа сделала это? Как тогда я могу это остановить?nohup
предотвращает процесс от полученияSIGHUP
сигнала, тогда как CTRL + C отправляетSIGINT
сигнал. Вот почемуnohup
не дает ожидаемого эффекта.Ответы:
Я был прав, думая, что это было
SIGINT
отправлено всем процессам, когда ctrl+ c, но я был глуп, думая, что создание другого процесса выведет его за пределыprocess group
(см. Мои попытки вP.P.S.
).Это не только точный вариант использования, но и правильное решение.
Из-за того, как мой сценарий был структурирован, ответ там не подходил дословно, теперь этот сценарий;
Сервер продолжает вывод в файл журнала после I ctrl+ cв
less
.Спасибо за все время.
источник
Вы пытались отречься ?
или чем бы вы ни занимались; disown - встроенная оболочка, ее страница руководства гласит:
РЕДАКТИРОВАТЬ
Забавно, ваша конструкция работает на моем Arch Linux:
Перед командой ps мне пришлось прокрутить файл out.log, затем Ctrl+C, потом q.
источник
nohup
строку в функцию, котораяdisowns
сама по себе, но это должно быть так же, какnohup
. Я не думаю, что этоSIGHUP
проблема, так как когда яless