ridirezionare - scrivere output su file linux




Come reindirizzare l'output di un processo già in esecuzione (4)

Normalmente vorrei iniziare un comando come

longcommand &;

So che puoi reindirizzare facendo qualcosa di simile

longcommand > /dev/null;

per esempio per sbarazzarsi dell'output o

longcommand 2>&1 > output.log

per catturare l'output.

Ma a volte mi dimentico, e mi stavo chiedendo se c'è un modo per catturare o reindirizzare dopo il fatto.

longcommand
ctrl-z
bg 2>&1 > /dev/null

o qualcosa del genere così posso continuare ad usare il terminale senza che i messaggi saltino fuori sul terminale.


Dupx

Dupx è una semplice utility * nix per reindirizzare l'output / input / errore standard di un processo già in esecuzione.

Motivazione

Mi sono spesso trovato in una situazione in cui un processo che ho avviato su un sistema remoto tramite SSH impiega molto più tempo di quanto avessi previsto. Devo interrompere la connessione SSH, ma se lo faccio, il processo morirà se tenta di scrivere qualcosa su stdout / errore di una pipe rotta. Vorrei poter sospendere il processo con ^ Z e poi fare a

bg %1 >/tmp/stdout 2>/tmp/stderr 

Sfortunatamente questo non funzionerà (in shell lo so).

http://www.isi.edu/~yuri/dupx/


Ho raccolto alcune informazioni su Internet e ho preparato lo script che non richiede uno strumento esterno: vedere la mia risposta qui . Spero che sia utile


Vedere Reindirizzare l'output da un processo in esecuzione .

Innanzitutto cat > foo1 il comando cat > foo1 in una sessione e verifica che i dati da stdin cat > foo1 copiati nel file. Poi in un'altra sessione reindirizzare l'output.

In primo luogo trova il PID del processo:

$ ps aux | grep cat
rjc 6760 0.0 0.0 1580 376 pts/5 S+ 15:31 0:00 cat

Ora controlla gli handle di file che ha aperto:

$ ls -l /proc/6760/fd
total 3
lrwx—— 1 rjc rjc 64 Feb 27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 Feb 27 15:32 1 -> /tmp/foo1
lrwx—— 1 rjc rjc 64 Feb 27 15:32 2 -> /dev/pts/5

Ora esegui GDB:

$ gdb -p 6760 /bin/cat
GNU gdb 6.4.90-debian

[license stuff snipped]

Attaching to program: /bin/cat, process 6760

[snip other stuff that's not interesting now]

(gdb) p close(1)
$1 = 0
(gdb) p creat("/tmp/foo3", 0600)
$2 = 1
(gdb) q
The program is running. Quit anyway (and detach it)? (y or n) y
Detaching from program: /bin/cat, process 6760

Il comando p in GDB stamperà il valore di un'espressione, un'espressione può essere una funzione da chiamare, può essere una chiamata di sistema ... Quindi eseguo una chiamata di sistema close() e passo l'handle di file 1, quindi eseguo un creat() chiamata di sistema per aprire un nuovo file. Il risultato di creat() era 1, il che significa che ha sostituito il precedente handle di file. Se volessi utilizzare lo stesso file per stdout e stderr o se volessi sostituire un handle di file con un altro numero, dovrei chiamare la chiamata di sistema dup2() per ottenere quel risultato.

Per questo esempio ho scelto di usare creat() invece di open() perché ci sono meno parametri. Le macro C per i flag non sono utilizzabili da GDB (non usa le intestazioni C), quindi dovrei leggere i file header per scoprirlo - non è così difficile farlo ma richiedere più tempo. Si noti che 0600 è l'autorizzazione ottale per il proprietario che ha accesso in lettura / scrittura e il gruppo e gli altri non hanno accesso. Funzionerebbe anche per usare 0 per quel parametro ed eseguire chmod sul file in seguito.

Successivamente, verificherò il risultato:

ls -l /proc/6760/fd/
total 3
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 0 -> /dev/pts/5
l-wx—— 1 rjc rjc 64 2008-02-27 15:32 1 -> /tmp/foo3 <====
lrwx—— 1 rjc rjc 64 2008-02-27 15:32 2 -> /dev/pts/5

Digitando più dati nei risultati cat , nel file /tmp/foo3 viene aggiunto.

Se si desidera chiudere la sessione originale, è necessario chiudere tutti gli handle di file per esso, aprire un nuovo dispositivo che può essere il tty di controllo e quindi chiamare setsid() .


Schermo

Se il processo è in esecuzione in una sessione dello schermo, è possibile utilizzare il comando di registro dello schermo per registrare l'output di quella finestra su un file:

Passare alla finestra dello script, Ca H per accedere.
Ora puoi :

$ tail -f screenlog.2 | grep whatever

Dalla pagina man dello schermo:

log [on | off]

Avvia / interrompe la scrittura dell'output della finestra corrente su un file "screenlog.n" nella directory predefinita della finestra, dove n è il numero della finestra corrente. Questo nome file può essere modificato con il comando 'logfile'. Se non viene fornito alcun parametro, lo stato di registrazione viene attivato. Il registro di sessione viene aggiunto al contenuto precedente del file, se già esiste. Il contenuto corrente e il contenuto della cronologia di scorrimento non sono inclusi nel registro di sessione. L'impostazione predefinita è 'off'.

Sono sicuro che anche tmux abbia qualcosa di simile.





bash