14

Я не знал, относится ли это к 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 & / or less в скобки (чтобы сделать это подоболочкой)

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

2 ответа2

9

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

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

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

#/bin/bash

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

Сервер продолжает выводить в файл журнала после того, как я 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, ни опция -r, используется текущее задание.Если спецификация заданий не указана, опция -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.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .