Как я могу переместить процесс в фоновый режим, а также заставить его замолчать?

11

Скажем, я запускаю процесс в терминале, и он отправляет вывод со стандартной ошибкой во время работы. Я хочу отодвинуть процесс на задний план и одновременно заставить его замолчать.

Есть ли способ сделать это, не останавливая процесс и не запуская его снова с помощью &и > /dev/null 2>&1? Мне интересно, есть ли какая-нибудь команда, которая выполняет bg и может также изменить выходные дескрипторы целевого процесса.

Дан
источник

Ответы:

9

Слишком поздно. После запуска процесса оболочка больше не контролирует дескрипторы файла процесса, поэтому вы не можете заставить ее замолчать с помощью команды оболочки.

Вы можете только попытаться убитьSIGHUP процесс. Если ваш процесс обрабатывает его правильно , он должен отсоединиться от управления tty . К сожалению, многие программы не справляются с этим правильно и просто умирают.

andcoz
источник
Вы не можете сделать CTRL + Z, чтобы поместить процесс в фоновом режиме? это не заставляет замолчать процесс, и если вы выйдете из системы, я думаю, что это тоже убьет процесс.
Рой Рико
1
@RoyRico, убиваяSIGSTOP процесс (или , как вы говорите , делаете CTRL + Z ) не подавляет процесс. Это останавливает процесс!
andcoz
5

Процесс, запущенный из терминала, имеет свои stdin, stdout и stderr, связанные с терминалом, и вы ничего не можете с этим поделать, не получив контроль над этим терминалом ... Обычно. Но есть несколько хитрых инструментов, которые действительно позволяют вам это сделать. Посмотрите на этот пример . И другие программы, подобные rettyупомянутым там.

rozcietrzewiacz
источник
3

Я не согласен с andcoz, что слишком поздно, чтобы заставить замолчать вывод.

Предполагая, что процесс выполняется на переднем плане, используйте, Ctrl-Zчтобы приостановить процесс. Это сообщит номер задания и идентификатор процесса. Вы можете пойти дальше и переместить процесс в фоновый режим, используя bg %1(для задания № 1). Хотя это перемещает процесс в фоновый режим, он не заглушает вывод. Чтобы отключить вывод, вы можете использовать gdbдля перенаправления всех выводов /dev/null.

Это было очень хорошо описано ранее по адресу /programming/593724/redirect-stderr-stdout-of-a-process-after-its-been-started-using-command-lin/593764#593764 .

Майк Ковингтон
источник
0

Еще один инструмент командной строки detach. Последняя версия поддерживает запись pid-файлов, использование файлов для stdin, stdout и stderr и запуск на переднем плане. (Сайт detachтакже обсуждает похожие инструменты.)

http://inglorion.net/software/detach/

Павел
источник