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
djangofan
la source
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.

Jacob Minshall
la source
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

RSFalcon7
la source
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

Abhinav Bhatia
la source
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.

Mani
la source
1

La teecommande est assez répandue aussi.

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

trevorgrayson
la source