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
Я пробував низку речей (жодна не працювала);

  • намагаючись відключити 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


Хтось, можливо, натрапив на мою проблему; I think it is due to the handling within the database software, not on the shell. Як програма це зробить? Як же я можу це зупинити?
Хешброн

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] [jobspec ...]

Без опцій кожен спецзапис видаляється з таблиці активних завдань. Якщо параметр -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 обмежує роботу запущеними завданнями.

EDIT

Смішна річ, ваша конструкція працює на моєму 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 pls дивись мою
редакцію

Так, я також зробив тест, з викликом простого скрипта bash замість виконуваного {SERVER}. І nohup просто добре працював. Дивіться мій коментар до питання. Я думаю, що це цілеспрямовано якось слухати. Оскільки його сервер (і не дуже відомий), я навіть не можу сказати, що це таке, щоб хтось міг піти "ой це робиш X, потрібно робити Y"
Hashbrown
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.