Перенаправление STDERR / STDOUT процесса после его запуска с помощью командной строки?
в оболочке вы можете сделать перенаправление,>< и т. д., но как насчет после запуска программы?
вот как я пришел, чтобы задать этот вопрос, программа, работающая в фоновом режиме моего терминала продолжает выводить раздражающий текст. Это важный процесс, поэтому я должен открыть другую оболочку, чтобы избежать текста. Я хотел бы иметь возможность >/dev/null или некоторые другие перенаправления, так что я могу продолжать работать в той же оболочке.
7 ответов:
за исключением закрытия и повторного открытия вашего tty (т. е. выхода из системы и обратно, что также может прекратить некоторые из ваших фоновых процессов в процессе) у вас есть только один выбор:
- прикрепите к рассматриваемому процессу с помощью gdb и запустите:
- p dup2 (open ("/dev / null", 0), 1)
- p dup2 (open ("/dev / null", 0), 2)
- отключить
- закрыть
например:
$ tail -f /var/log/lastlog & [1] 5636 $ ls -l /proc/5636/fd total 0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/pts/0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/pts/0 lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog $ gdb -p 5636 GNU gdb 6.8-debian Copyright (C) 2008 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-linux-gnu". Attaching to process 5636 Reading symbols from /usr/bin/tail...(no debugging symbols found)...done. Reading symbols from /lib/librt.so.1...(no debugging symbols found)...done. Loaded symbols for /lib/librt.so.1 Reading symbols from /lib/libc.so.6...(no debugging symbols found)...done. Loaded symbols for /lib/libc.so.6 Reading symbols from /lib/libpthread.so.0...(no debugging symbols found)...done. [Thread debugging using libthread_db enabled] [New Thread 0x7f3c8f5a66e0 (LWP 5636)] Loaded symbols for /lib/libpthread.so.0 Reading symbols from /lib/ld-linux-x86-64.so.2...(no debugging symbols found)...done. Loaded symbols for /lib64/ld-linux-x86-64.so.2 (no debugging symbols found) 0x00007f3c8eec7b50 in nanosleep () from /lib/libc.so.6 (gdb) p dup2(open("/dev/null",0),1) [Switching to Thread 0x7f3c8f5a66e0 (LWP 5636)] = 1 (gdb) p dup2(open("/dev/null",0),2) = 2 (gdb) detach Detaching from program: /usr/bin/tail, process 5636 (gdb) quit $ ls -l /proc/5636/fd total 0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 0 -> /dev/pts/0 lrwx------ 1 myuser myuser 64 Feb 27 07:36 1 -> /dev/null lrwx------ 1 myuser myuser 64 Feb 27 07:36 2 -> /dev/null lr-x------ 1 myuser myuser 64 Feb 27 07:36 3 -> /var/log/lastlog lr-x------ 1 myuser myuser 64 Feb 27 07:36 4 -> /dev/null lr-x------ 1 myuser myuser 64 Feb 27 07:36 5 -> /dev/nullвы можете также рассмотрим:
- используя
screen; экран предоставляет несколько виртуальных TTYs вы можете переключаться между без необходимости открывать новые SSH / telnet / etc, сеансы- используя
nohup; это позволяет закрыть и снова открыть сеанс без потери каких-либо фоновых процессов в... процесс.
это:
strace -ewrite -p $PIDэто не так чисто (показывает такие строки, как:
write(#,<text you want to see>)), но работает!
вам также может не понравиться тот факт, что аргументы сокращены. Для управления этим используйте
-sпараметр, задающий максимальную длину отображаемых строк.он ловит все потоки, так что вы можете фильтровать это как-то:
strace -ewrite -p $PID 2>&1 | grep "write(1"показывает только вызовы дескриптора 1.
2>&1это перенаправить STDERR на STDOUT, какstraceзапись в STDERR по умолчанию.
риффинг от владра (и других) отличные исследования:
создайте следующие два файла в одном каталоге, что-то в вашем пути, скажем $HOME/bin:
тишина.gdb, содержащий (из ответа владра):
p dup2(open("/dev/null",0),1) p dup2(open("/dev/null",0),2) detach quitи тишина, содержащих:
#!/bin/sh if [ "" -a "" ]; then gdb -p -x .gdb else echo Must specify PID of process to silence >&2 fichmod +x ~/bin/silence # make the script executableтеперь, в следующий раз, когда вы забудете перенаправить firefox, например, и ваш терминал начнет загромождаться неизбежным " (firefox-bin:5117): Gdk-WARNING **: XID столкновение, беда впереди " сообщения:
ps # look for process xulrunner-stub (in this case we saw the PID in the error above) silence 5117 # run the script, using PID we foundвы также можете перенаправить вывод gdb в /dev / null, если вы не хотите его видеть.
перенаправление вывода из запущенного процесса на другой терминал, файл или экран:
tty ls -l /proc/20818/fd gdb -p 20818внутри gdb:
p close(1) p open("/dev/pts/4", 1) p close(2) p open("/tmp/myerrlog", 1) qотключить запущенный процесс с Баш терминал и сохранить его живым:
[Ctrl+z] bg %1 && disown %1 [Ctrl+d]объяснение:
20818-просто пример запуска процесса pid
p-результат печати команды gdb
close(1) - закрыть стандартный вывод
/dev/pts / 4 - терминал для записи в
рядом(2) - закрыть вывод ошибок
/tmp / myerrlog-файл для записи в
q-выйти из gdb
bg %1-выполнить остановленное задание 1 в фоновом режиме
откреститься %1-отсоединить задание 1 от терминала
не прямой ответ на ваш вопрос, но это метод, который я нашел полезным в течение последних нескольких дней: запустите начальную команду с помощью "экрана", а затем отсоедините.
это часть скрипта bash, основанная на предыдущих ответах, которые перенаправляют файл журнала во время выполнения открытого процесса, он используется в качестве postscript в
logrotate
Dupx Это простая утилита * nix для перенаправления стандартного вывода / ввода / ошибки уже запущенного процесса.
Comments