2010-03-24 11 views
5

Ho un'applicazione che esegue il comando come di seguito:come reindirizzare l'output da/dev/null

<command> <switches> >& /dev/null

posso configurare <command>, ma non ho alcun controllo su <switches>. Tutto l'output generato da questo comando va a /dev/null. Voglio che l'output sia visibile sullo schermo o reindirizzato a un file di registro.

Ho provato a utilizzare freopen() e le relative funzioni per riaprire /dev/null in un altro file, ma non sono riuscito a farlo funzionare.

Avete altre idee? Ciò è effettivamente possibile?

Grazie per il vostro tempo.

PS: Sto lavorando su Linux.

+0

Che cosa ha a che fare con il Perl? –

+0

A meno che tu non possa cambiare il comando nella sceneggiatura, penso che tu sia sfortunato. Una volta reindirizzato a null, non è possibile recuperarlo perché tutti i descrittori di file che potresti condividere con esso (stdin, stdout, stderr) sono spariti. – tvanfosson

+0

Quindi hai il controllo sul comando, ma non il reindirizzamento di esso? Se è così, direi che e-t172 ha ragione, o almeno per quello che hai intenzione di ottenere: http://stackoverflow.com/questions/2507569/how-to-redirect-output-away-from -dev-null/2507624 # 2507624 In caso contrario, si prega di aggiornare per chiarire. –

risposta

4

Poiché è possibile modificare il comando eseguito, è possibile utilizzare uno script di shell semplice come wrapper per reindirizzare l'output in un file.

#!/bin/bash 
"[email protected]" >> logfile 

Se si salva questo nel vostro percorso come capture_output.sh Quindi è possibile aggiungere capture_output.sh per l'inizio della vostra comando per aggiungere l'output del programma di file di log.

7

Terribile Hack:

utilizzare un editor di testo in modo binario aprire l'applicazione, trovare '/ dev/null /' e sostituirla con una stringa della stessa lunghezza

e.g '~/tmp/log' 
  • make un backup prima
  • fate attenzione
  • essere molto attenti
  • mi ha fatto ricordare il backup?
+0

Chiarimento: apri l'eseguibile binario con l'editor di testo.Qualcosa nel linguaggio senza senso del file binario dovrebbe essere "/ dev/null" che è ciò che sostituisci come suggerito sopra. – Ricket

+0

@lexu: l'avevo fatto prima Sostituito/dev/null con una stringa di spazi di uguale lunghezza Questo funziona, ma per ogni versione dell'applicazione, l'hacking dell'eseguibile è noioso ... Io ero pensando di scrivere un programma che esegue qualche reindirizzamento e chiama lo . Questo sarà uno sforzo di una volta. – Gowtham

+1

+1 per l'elenco di accompagnamento. –

2

Aggiungere # alla fine del comando in modo che diventi <command> # >& /dev/null, commentando così la parte indesiderata.

+0

@ e-t172: buona idea. Ho dimenticato di menzionare lo . Il comando è chiamato come '> &/dev/null' – Gowtham

1

È possibile creare un alias per tale comando? In caso affermativo, lo si collega a un altro comando che esegue il dump dell'output in un file.

0

MODIFICA: Questa NON è una buona idea e certamente non vale la pena di provarla a meno che non si sappia cosa può causare. Funziona per me, può funzionare anche per te.

Ok, questo è un vero trucco e probabilmente non vale la pena farlo. Supponendo che nessuno degli altri comandi funzioni, e semplicemente non si ha accesso al binario/all'applicazione (che contiene il comando con /dev/null) e non è possibile reindirizzare l'output su un altro file (sostituendo /dev/null).

Quindi, è possibile eliminare/dev/null ($> rm /dev/null) e creare il proprio file al suo posto (preferibilmente con un collegamento software) in cui tutti i dati possono essere indirizzati. Quando hai finito, è possibile creare il/dev/null, ancora una volta usando seguente comando:

$> mknod -m 666 /dev/null c 1 3

Giusto per essere molto chiaro, questo è una cattiva trucco e certamente richiede radice autorizzazioni per il lavoro . Elevate possibilità che il file reindirizzato possa contenere dati da molte altre applicazioni/binari che sono in esecuzione e utilizzare /dev/null come sink.

+0

Solo per aggiungere, ho provato questo sul mio computer che è un Fedora in esecuzione 2.6.30. Questa informazione è così perché il numero Maggiore e Minore potrebbe essere diverso per mknod su altre piattaforme/ambiente. – Shrey

+0

Sarebbe bello se "perché-la-mia-risposta-fosse-votata-giù" fosse spiegato come commento. So che questo è un hack (citato quieto chiaramente) e questo è esplicitamente ciò che il poster stava cercando "... ma non ho controllo su ...". – Shrey

+0

Rimuovere/dev/null va oltre l'essere un hack. È un'idea completamente spezzata. Influisce sull'intero sistema (qualsiasi nuova apertura sul nome del percorso), non solo sullo script/programma mirato. Deve essere "riparato" dopo aver finito. E richiede l'accesso alla radice.La risposta qui non è di "reindirizzare/dev/null" ma di riaprire i descrittori esistenti originariamente aperti da/dev/null. –

1

Il file di dispositivo /dev/tty riferimento per il terminale di controllo dell'applicazione - se questo non è cambiato, allora questo dovrebbe funzionare:

freopen("/dev/tty", "w", stdout); 
freopen("/dev/tty", "w", stderr); 

In alternativa, è possibile riaprirli per puntare a un file di log:

freopen("/var/log/myapp.log", "a", stdout); 
freopen("/var/log/myapp.err", "a", stderr); 
2

L'applicazione sta probabilmente eseguendo una shell e passandogli quella riga di comando.

È necessario farlo eseguire una sceneggiatura scritta da voi. Tale script sostituirà >/dev/null nella riga di comando con >>/your/log e richiamerà la shell reale con la riga di comando modificata.

Il primo passaggio consiste nel modificare la shell utilizzata dall'applicazione. Cambiare la variabile d'ambiente SHELL dovrebbe essere sufficiente, cioè, eseguire l'applicazione come

SHELL=/home/user/bin/myshell theApp 

Se questo non funziona, provare momentaneamente collega /bin/sh allo script.

myshell chiamerà guscio originale, ma dopo modello di sostituzione dei parametri:

#!/bin/bash 
sh ${1+"${@/\>\/dev\/null/>>\/your\/log}"} 

Qualcosa del genere dovrebbe funzionare.

0

in Perl, se si desidera solo per reindirizzare STDOUT a qualcosa di un po 'più utile, si può solo fare qualcosa di simile:

open STDOUT, '>>', '/var/log/myscript.log'; 
open STDERR, '>>', '/var/log/myscript.err'; 

all'inizio del vostro script, e che sarà reindirizzare esso per il resto del tuo copione

0

Lungo le linee di risposta di e-T172, è possibile impostare l'ultimo interruttore su (o aggiungere ad esso):

; echo 
1

Può non esattamente reindirizzare, ma permette di ottenere l'output ovunque è di essere inviato

strace -ewrite -p $PID

non è che cleen (mostra linee come: scrittura (#,)), ma funziona! (ed è a linea singola: D) Potrebbe anche non piacere il fatto che gli argomenti siano abbreviati. Per controllare il parametro use -s che imposta la lunghezza massima delle stringhe visualizzate.

Cattura tutti gli stream, quindi potresti volerli filtrare in qualche modo.

È possibile filtrare è:

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

mostra solo descrittore 1 chiamate. 2> & 1 sta per reindirizzare stderr su stdout, come strace scrive su stderr per impostazione predefinita.

0

Se è possibile inserire qualcosa inline prima di passare a/dev/null (non è sicuro se si ha a che fare con un comando hardcoded), è possibile utilizzare tee per reindirizzare a qualcosa di propria scelta.

Esempio da Wikipedia, che permette l'escalation di un comando:

echo "Body of file..." | sudo tee root_owned_file > /dev/null 

http://en.wikipedia.org/wiki/Tee_(command)

Problemi correlati