Я не знав, чи належить це до 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
Я пробував низку речей (жодна не працювала);
намагаючись відключити stdin від сценарію, змінивши
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
nohup
не дозволяє процесу приймати SIGHUP
сигнал, тоді як CTRL + C посилає SIGINT
сигнал. Ось чому nohup
не має ефекту, якого ви очікували.
I think it is due to the handling within the database software, not on the shell
. Як програма це зробить? Як же я можу це зупинити?