Как перенаправить вывод из / dev / null - PullRequest
5 голосов
/ 24 марта 2010

У меня есть приложение, которое запускает команду, как показано ниже:

<command> <switches> >& /dev/null

Я могу настроить <command>, но у меня нет контроля над <switches>. Все выходные данные, сгенерированные этой командой, отправляются на /dev/null. Я хочу, чтобы вывод был виден на экране или перенаправлен в файл журнала.

Я пытался использовать freopen() и связанные с ним функции, чтобы открыть /dev/null для другого файла, но не смог заставить его работать.

У вас есть другие идеи? Возможно ли это вообще?

Спасибо за ваше время.

PS: я работаю в Linux.

Ответы [ 12 ]

7 голосов
/ 24 марта 2010

ужасный хак:

используйте текстовый редактор в двоичном режиме, откройте приложение, найдите '/ dev / null /' и замените его строкой такой же длины

e.g '~/tmp/log'
  • сначала сделайте резервную копию
  • будь осторожен
  • будь очень осторожен
  • я упоминал о резервной копии?
4 голосов
/ 24 марта 2010

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

#!/bin/bash
"$@" >> logfile

Если вы сохраните это в своем пути как capture_output.sh, тогда вы можете добавить capture_output.sh в начало вашей команды, чтобы добавить вывод вашей программы в файл журнала.

2 голосов
/ 24 марта 2010

Возможно, ваше приложение запускает оболочку и передает ей эту командную строку.

Вы должны запустить скрипт, написанный вами. Этот скрипт заменит >/dev/null в командной строке на >>/your/log и вызовет реальную оболочку с измененной командной строкой.

Первый шаг - изменить оболочку, используемую приложением. Достаточно изменить переменную среды SHELL, т.е. запустить приложение как

SHELL=/home/user/bin/myshell theApp

Если это не сработает, попробуйте на мгновение связать /bin/sh со своим сценарием.

myshell вызовет исходную оболочку, но после шаблонной замены параметров:

#!/bin/bash
sh ${1+"${@/\>\/dev\/null/>>\/your\/log}"}

Что-то в этом духе должно работать.

2 голосов
/ 24 марта 2010

Добавьте # в конце вашей команды, чтобы оно стало <command> # >& /dev/null, комментируя нежелательную часть.

1 голос
/ 28 апреля 2010

Возможно, он не перенаправлен точно, но позволяет получать выходные данные, куда бы он ни отправлялся

strace -ewrite -p $PID

Это не так чисто (показывает такие строки, как: write (#,)), но работает! (и однострочный: D) Вам также может не понравиться тот факт, что аргументы сокращены. Для управления этим параметром -s задается максимальная длина отображаемых строк.

Он перехватывает все потоки, так что вы можете захотеть как-то отфильтровать.

Вы можете отфильтровать это:

strace -ewrite -p $PID 2>&1 | grep "write(1"

показывает только вызовы дескриптора 1. 2> & 1 - перенаправить stderr в stdout, так как strace записывает в stderr по умолчанию.

1 голос
/ 24 марта 2010

Файл устройства /dev/tty ссылается на управляющий терминал вашего приложения - если это не изменилось, то это должно работать:

freopen("/dev/tty", "w", stdout);
freopen("/dev/tty", "w", stderr);

Кроме того, вы можете открыть их снова, чтобы указать на файл журнала:

freopen("/var/log/myapp.log", "a", stdout);
freopen("/var/log/myapp.err", "a", stderr);
1 голос
/ 24 марта 2010

Можете ли вы создать псевдоним для этой команды? Если это так, присвойте псевдоним другой команде, которая выводит выходные данные в файл.

1 голос
/ 24 марта 2010

Вы можете сделать это с уже запущенным процессом, используя gdb. Смотрите следующую страницу: http://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/

0 голосов
/ 16 мая 2010

Если вы можете поместить что-то в строку перед передачей чего-либо в / dev / null (не уверен, что имеете дело с жестко закодированной командой), вы можете использовать tee для перенаправления на что-то по вашему выбору.

Пример из Википедии, которая разрешает эскалацию команды:

echo "Body of file..." | sudo tee root_owned_file > /dev/null

http://en.wikipedia.org/wiki/Tee_(command)

0 голосов
/ 24 марта 2010

В соответствии с ответом e-t172, можете ли вы установить последний переключатель на (или добавить к нему):

; echo 
...