Puis-je rediriger la sortie vers un fichier journal et mettre en arrière-plan un processus en même temps?


116

Puis-je rediriger la sortie vers un fichier journal et mettre en arrière-plan un processus en même temps?

En d'autres termes, puis-je faire quelque chose comme ça?

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

Ou n'est-ce pas un ordre légal? Ou dois-je le déplacer manuellement vers l'arrière-plan, comme ceci:

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

2
L'as tu essayé? Quelle erreur obtenez-vous? De plus, je ne sais pas si vous avez une faute de frappe ou une erreur dans votre code. 2>$1est probablement censé être 2>&1.
Patrick

Réponses:


171

Un problème avec votre première commande est que vous redirigez stderr vers stdout (si vous avez changé le $ en a & comme suggéré dans le commentaire), puis vous redirigez stdout vers un fichier journal, mais cela ne suit pas stderr . Vous devez le faire dans l'ordre inverse, envoyez d'abord stdout à l'endroit souhaité, puis envoyez stderr à l'adresse stdout est à

some_cmd > some_file 2>&1 &

et ensuite vous pouvez lancer le & pour l'envoyer à l'arrière-plan. Les travaux peuvent être consultés avec la jobscommande. jobsva vous montrer les travaux en cours, et les numéroter. Vous pouvez ensuite parler des emplois en utilisant un% suivi du nombre, kill %1ou à peu près .

De plus, sans le & on vous pouvez suspendre la commande avec Ctrlz, utilisez la bgcommande pour la mettre en arrière-plan et la fgramener au premier plan. En combinaison avec la jobscommande, c'est puissant.

pour clarifier la partie ci-dessus sur l'ordre dans lequel vous écrivez les commandes. Supposons que stderr soit l’adresse 1002, stdout l’adresse 1001 et le fichier 1008. La commande se lit de gauche à droite. La première chose qu’elle voit dans la vôtre est donc celle 2>&1qui se déplace vers l’adresse 1001 > file; mais conserve stderr à 1001. Il ne tire pas tout ce qui pointe vers 1001 et ne le déplace pas vers 1008, mais référence simplement stdout et le déplace vers le fichier.
Dans l’inverse, il déplace la sortie standard vers 1008, puis se déplace vers le point indiqué par stdout, 1008 également. De cette façon, les deux peuvent pointer vers le fichier unique.


ne semble pas pouvoir capturer le pid après cela$!
chovy

8
Il convient également de noter que vous pouvez utiliser &> file.outpour rediriger stdin et stdout vers un fichier de sortie, ce qui réduit les risques d'erreur 2>&1lors de l'insertion au mauvais endroit de votre ligne de commande.
Dan

14

Arrêter avec <Ctrl+Z>et continuer en arrière-plan bgest équivalent à exécuter avec &à la fin de la commande.

Donc, pour exécuter en arrière-plan et rediriger la sortie:

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

Si vous avez également besoin que cette commande ne meure pas lorsque vous quittez le terminal, vous devez utiliser nohup


Oh je vois. Vous dites que le caractère '&' ajouté est redondant?
djangofan

Je viens de citer la page de manuel. Puisque nohup exécutera la commande en arrière-plan de toute façon, semble redondant pour exécuter nohup lui-même en arrière
RSFalcon7

10
nohup n'exécute pas la commande en arrière-plan, vous devez explicitement ajouter&
jlliagre

3
Une fois que vous avez déplacé un processus en arrière-plan bg, vous pouvez le dissocier de votre session en le lançant disown, ce qui signifie que le processus ne meurt pas lorsque vous fermez le terminal.
Koen.

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

Notez que la commande &>dirige stdout et stderr vers output.log


3
Une explication d’une ligne complètera la réponse.
Anaik

2
@ abhisheknaik96 exécute le fichier jar et redirige stdin et stderr vers output.log et en fait un processus en arrière-plan.
P Pang

2

Au lieu d'utiliser nohup, vous pouvez utiliser l'écran. Vous pouvez voir le statut du programme en temps réel. vous pouvez même enregistrer toute la sortie dans un fichier. C'est utile lorsque vous accédez au serveur via ssh où vous êtes déconnecté à cause d'une mauvaise connexion ou de l'inactivité. Après vous être connecté, vous pouvez continuer le travail depuis votre point de départ. référez ceci et cela pour savoir en détail.


1

La teecommande est assez répandue aussi.

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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.