GNU/Linux >> Znalost Linux >  >> Linux

Přesměrovat STDERR / STDOUT procesu PO jeho spuštění pomocí příkazového řádku?

Kromě zavření a opětovného otevření vašeho tty (tj. odhlášení a opětovného zapnutí, což může také ukončit některé vaše procesy na pozadí v procesu), máte pouze jednu možnost:

  • připojte se k příslušnému procesu pomocí gdb a spusťte:
    • p dup2(open("/dev/null", 0), 1)
    • p dup2(open("/dev/null", 0); 2)
    • odpojit
    • ukončit

např.:

$ 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 = 1

(gdb) p dup2(open("/dev/null",0),2)
$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

Můžete také zvážit:

  • pomocí screen; obrazovka poskytuje několik virtuálních TTY, mezi kterými můžete přepínat, aniž byste museli otevírat nové relace SSH/telnet/atd.
  • pomocí nohup; to vám umožní zavřít a znovu otevřít vaši relaci bez ztráty jakýchkoli procesů na pozadí během... procesu.

To udělá:

strace -ewrite -p $PID

Není to tak čisté (zobrazuje řádky jako:write(#,<text you want to see>) ), ale funguje!

Možná se vám také nelíbí, že argumenty jsou zkrácené. Chcete-li to ovládat, použijte -s parametr, který nastavuje maximální délku zobrazených řetězců.

Zachycuje všechny streamy, takže to možná budete chtít nějak filtrovat:

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

zobrazuje pouze volání deskriptoru 1. 2>&1 je přesměrovat STDERR na STDOUT, jako strace ve výchozím nastavení zapisuje do STDERR.


podtrhávání vladrova (a dalších) vynikajících výzkumů:

vytvořte následující dva soubory ve stejném adresáři, něco ve vaší cestě, řekněme $HOME/bin:

silent.gdb, obsahující (z vladrovy odpovědi):


p dup2(open("/dev/null",0),1)
p dup2(open("/dev/null",0),2)
detach
quit

a ticho, obsahující:


#!/bin/sh
if [ "$0" -a "$1" ]; then
 gdb -p $1 -x $0.gdb
else
 echo Must specify PID of process to silence >&2
fi

chmod +x ~/bin/silence  # make the script executable

Nyní, až příště zapomenete přesměrovat například firefox, a váš terminál se začne zahlcovat nevyhnutelnými zprávami "(firefox-bin:5117):Gdk-WARNING **:XID kolize, potíže před námi":


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

Můžete také přesměrovat výstup gdb do /dev/null, pokud jej nechcete vidět.


Linux
  1. Jak vytvořit databázi v MySQL pomocí příkazového řádku

  2. Zastavit/ukončit proces z příkazového řádku po určité době?

  3. Odezva textu po příkazu Curl na stejném řádku?

  1. Jak restartovat Linux pomocí příkazového řádku

  2. Odinstalovat Node.JS pomocí příkazového řádku Linuxu?

  3. Jak přesměrovat stderr a stdout na různé soubory ve stejném řádku ve skriptu?

  1. Jak vypnout nebo restartovat Linux pomocí příkazového řádku

  2. Nastavte relativní čas pomocí příkazového řádku

  3. Zachycení STDERR a STDOUT do souboru pomocí tee