Перенаправление STDERR / STDOUT процесса после его запуска с помощью командной строки?



в оболочке вы можете сделать перенаправление,>< и т. д., но как насчет после запуска программы?



вот как я пришел, чтобы задать этот вопрос, программа, работающая в фоновом режиме моего терминала продолжает выводить раздражающий текст. Это важный процесс, поэтому я должен открыть другую оболочку, чтобы избежать текста. Я хотел бы иметь возможность >/dev/null или некоторые другие перенаправления, так что я могу продолжать работать в той же оболочке.

568   7  

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
fi

chmod +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 для перенаправления стандартного вывода / ввода / ошибки уже запущенного процесса.

https://www.isi.edu / ~Юрий / dupx/

Comments

    Ничего не найдено.