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.