Posso reindirizzare l'output su un file di registro e avviare contemporaneamente un processo?


116

Posso reindirizzare l'output su un file di registro e avviare contemporaneamente un processo?

In altre parole, posso fare qualcosa del genere?

nohup java -jar myProgram.jar 2>&1 > output.log &

Oppure non è un comando legale? Oppure, devo spostarlo manualmente sullo sfondo, in questo modo:

java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1

2
L'hai provato? Che errore ricevi? Inoltre, non sono sicuro che tu abbia un refuso o un errore nel tuo codice. 2>$1probabilmente dovrebbe essere 2>&1.
Patrick,

Risposte:


171

Un problema con il tuo primo comando è che reindirizzi stderr su dove si trova stdout (se hai cambiato $ in a & come suggerito nel commento) e quindi, hai reindirizzato stdout su un file di registro, ma questo non tira avanti lo stderr reindirizzato . Devi farlo nell'altro ordine, prima inviare stdout dove vuoi che vada, quindi inviare stderr all'indirizzo stdout è a

some_cmd > some_file 2>&1 &

e quindi potresti lanciare & on per inviarlo in background. È possibile accedere ai lavori con il jobscomando. jobsti mostrerà i lavori in corso e li numererà. Potresti quindi parlare dei lavori usando una% seguita dal numero kill %1o giù di lì.

Inoltre, senza il simbolo & alla fine puoi sospendere il comando Ctrlz, usa il bgcomando per metterlo in background e fgriportarlo in primo piano. In combinazione con il jobscomando, questo è potente.

per chiarire la parte precedente sull'ordine in cui si scrivono i comandi. Supponiamo che stderr sia l'indirizzo 1002, stdout sia l'indirizzo 1001 e il file sia 1008. Il comando legge da sinistra a destra, quindi la prima cosa che vede nel tuo è 2>&1che sposta stderr all'indirizzo 1001, quindi vede > fileche sposta stdout su 1008, ma mantiene stderr a 1001. Non estrae tutto ciò che punta a 1001 e lo sposta su 1008, ma fa semplicemente riferimento a stdout e lo sposta nel file.
Al contrario, sposta stdout su 1008, quindi sposta stderr nel punto a cui punta stdout, anche 1008. In questo modo entrambi possono puntare al singolo file.


non riesco a catturare il pid dopo questo, anche se con$!
chovy

8
Vale anche la pena notare: è possibile utilizzare &> file.outper reindirizzare sia stdin che stdout a un file di output, il che riduce la possibilità di un errore 2>&1nel mettere nella posizione sbagliata nella riga di comando.
Dan

14

Fermarsi con <Ctrl+Z>e continuare in background con bgequivale a eseguire con &alla fine del comando.

Quindi, per eseguire in background e reindirizzare l'output:

java -jar myProgram.jar 2> errorOutput.log > output.log &

Se hai anche bisogno che questo comando non muoia quando lasci il terminale, allora dovresti usare nohup


Oh, capisco. Stai dicendo che il carattere "&" allegato è ridondante?
Djangofan,

Cito solo la manpage. Poiché nohup eseguirà comunque il comando in background, sembra ridondante eseguire lo stesso nohup in background
RSFalcon7

10
nohup non esegue il comando in background, devi aggiungere esplicitamente&
jlliagre

3
Dopo aver spostato un processo in background con bg, è possibile staccarlo dalla sessione eseguendo disown, il che fa sì che il processo non muoia quando si chiude il terminale.
Koen.

14
java -jar myProgram.jar &> output.log &

Nota che &>dirige sia stdout che stderr su output.log


3
Una spiegazione di una riga completerà la risposta.
anaik,

2
@ abhisheknaik96 esegue il file jar e reindirizza sia stdin che stderr su output.log e lo rende in background.
Pang

2

Invece di usare nohup puoi usare lo schermo. È possibile visualizzare lo stato del programma in tempo reale. puoi persino registrare tutto l'output in un file. È utile quando si accede al server tramite ssh da cui si è disconnessi a causa di scarsa connessione o inattività. Dopo aver effettuato l'accesso puoi continuare il lavoro da dove hai lasciato. fare riferimento a questo e questo per sapere in dettaglio.


1

Anche il teecomando è piuttosto diffuso.

nohup java -jar myProgram.jar | tee output.log &

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.