Я ищу способ перенаправить вывод фонового процесса в /dev/null или какой-либо другой файл.

$ python ./spam_console.py &
$ [start doing something in the foreground
$ cat test.py
$ [whole console is spammed with output of python program]

Я ищу способ вывести stdout, stderr этих процессов в какой-нибудь файл, используя простую утилиту командной строки.

$ dump_to -p 1526 --out /dev/null

На https://superuser.com/a/732504 есть отличное решение с использованием gdb, но я ищу способ обернуть все это простой программой alias/c, чтобы ее можно было легко использовать в командной строке. , Я ищу помощь в доступе к GDB неинтерактивным (или программным) способом для выполнения команды в связанной статье.

1 ответ1

1

Я нашел ответ после обширного поиска хакерских новостей. dupx точно делает то, что я искал.

Dupx - это простая утилита для переназначения файлов уже запущенной программы. Такие оболочки, как Bash, позволяют легко перенаправлять ввод / вывод / ошибку во время запуска программы с использованием > , < - подобного синтаксиса, например:

echo 'redirect this text' > /tmp/stdout 

перенаправит вывод эха в /tmp/stdout .

Стандартные оболочки, однако, не предоставляют возможности переотображения (перенаправления) вывода (или ввода, или ошибки) для уже запущенного процесса. Дупкс пытается решить эту проблему [...]

[...]

Пример использования

Обратите внимание, что в этих примерах используется синтаксис bash. Сначала мы запускаем фоновое задание bash, которое спит, а затем выводит что-то на стандартный вывод:

bash -c 'sleep 1m && echo rise and shine' &
  1. Перенаправить остаток стандартного вывода в /tmp/stdout

    Следующие вызовы эквивалентны:

    dupx -n 0:/tmp/test $!
    dupx -o /tmp/test $! 
    dupx $! >>/tmp/test 
    

    Обратите внимание, что последний пример также переназначает stderr и stdin процесса. Но поскольку целевой процесс был запущен в тот же tty, в котором выполняется dupx , они практически не изменились.

  2. Перенаправьте остаток от stdout и stderr в разные файлы, прочитайте остаток от stdin из /dev/null:

    Следующие вызовы эквивалентны:

    dupx -o /tmp/stdout -e /tmp/stderr -i /dev/null $! 
    dupx -n 0:/tmp/stdout 1:/dev/null 2:/tmp/stderr $! 
    dupx >/tmp/stdout 2>/tmp/stderr </dev/null $!
    

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