Я не знал, относится ли это к 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
вверху! Ничего другого не затронуто. Я могу сдвинуть+f, чтобы снова начать следить за журналом (который не получает никакой новой информации, так как сервер убит), и если я нажму Q, остальная часть сценария будет выполняться нормально.
Вы знаете, почему это происходит? Как избежать этого / что-то еще, что я должен использовать?
PS
Программа сервера может прослушивать ^C
, что может быть проблемой; что я могу сделать, чтобы остановить это? Например, когда я просто запускаю {SERVERCOMMAND}
самостоятельно (блокирующим образом), я могу нажать ctrl+c , что не сразу его убивает; он печатает Received ^C signal, shutting down
(а затем убивает себя). Это то, что происходит, когда I ^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
& / orless
в скобки (чтобы сделать это подоболочкой)запустить скрипт в
xterm
вместоkonsole