GNU/Linux >> Linux Esercitazione >  >> Linux

Reindirizzare STDERR / STDOUT di un processo DOPO che è stato avviato, utilizzando la riga di comando?

A meno di chiudere e riaprire il tuo tty (ovvero disconnettersi e riconnettersi, che potrebbe anche terminare alcuni dei tuoi processi in background nel processo) hai solo una scelta rimasta:

  • allegare al processo in questione utilizzando gdb ed eseguire:
    • p dup2(open("/dev/null", 0), 1)
    • p dup2(open("/dev/null", 0), 2)
    • stacca
    • esci

ad esempio:

$ 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

Puoi anche considerare:

  • usando screen; screen fornisce diversi TTY virtuali che puoi passare da uno all'altro senza dover aprire nuove sessioni SSH/telnet/etc
  • usando nohup; questo ti consente di chiudere e riaprire la sessione senza perdere alcun processo in background nel... processo.

Questo farà:

strace -ewrite -p $PID

Non è così pulito (mostra linee come:write(#,<text you want to see>) ), ma funziona!

Potrebbe anche non piacerti il ​​fatto che gli argomenti siano abbreviati. Per controllarlo usa il -s parametro che imposta la lunghezza massima delle stringhe visualizzate.

Cattura tutti i flussi, quindi potresti volerlo filtrare in qualche modo:

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

mostra solo le chiamate del descrittore 1. 2>&1 è reindirizzare STDERR a STDOUT, come strace scrive su STDERR per impostazione predefinita.


prendendo spunto dall'eccellente ricerca di vladr (e di altri):

crea i seguenti due file nella stessa directory, qualcosa nel tuo percorso, ad esempio $HOME/bin:

silenzio.gdb, contenente (dalla risposta di vladr):


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

e silenzio, contenente:


#!/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

Ora, la prossima volta che ti dimentichi di reindirizzare firefox, ad esempio, e il tuo terminale inizia a riempirsi degli inevitabili messaggi "(firefox-bin:5117):Gdk-WARNING **:XID collision, trouble ahead":


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

Puoi anche reindirizzare l'output di gdb a /dev/null se non vuoi vederlo.


Linux
  1. Un'introduzione all'uso di tcpdump nella riga di comando di Linux

  2. Ripeti il ​​testo dopo il comando arricciatura sulla stessa riga?

  3. Disinstallare Node.JS utilizzando la riga di comando di Linux?

  4. Come reindirizzare stderr e stdout a file diversi nella stessa riga nello script?

  5. Imposta il tempo relativo utilizzando la riga di comando

Come creare un file in Linux utilizzando Terminale/riga di comando

Come reindirizzare stderr a stdout in Bash

Conosci il tuo sistema (usando la riga di comando)

Come creare un database in MySQL utilizzando la riga di comando

Come testare la velocità di Internet usando la riga di comando in Linux

Acquisizione di STDERR e STDOUT da archiviare utilizzando tee