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 commandement légal? Ou dois-je le déplacer manuellement en arrière-plan, comme ceci:
Java -jar myProgram.jar 2>$1 > output.log
jobs
[CTRL-Z]
bg 1
Un problème avec votre première commande est que vous redirigez stderr vers où se trouve stdout (si vous avez changé le $ en a & comme suggéré dans le commentaire) et ensuite, vous avez redirigé stdout vers un fichier journal, mais cela ne tire pas le long du stderr redirigé . Vous devez le faire dans l'autre ordre, envoyez d'abord stdout à l'endroit où vous voulez qu'il aille, puis envoyez stderr à l'adresse stdout se trouve à
some_cmd > some_file 2>&1 &
puis vous pouvez lancer le & pour l'envoyer en arrière-plan. Les travaux sont accessibles avec la commande jobs
. jobs
vous montrera les travaux en cours et les numérotera. Vous pouvez ensuite parler des travaux en utilisant un% suivi du nombre comme kill %1
ou plus.
De plus, sans le & à la fin, vous pouvez suspendre la commande avec Ctrlz, utilisez la commande bg
pour le mettre en arrière-plan et fg
pour le ramener au premier plan. En combinaison avec la commande jobs
, c'est puissant.
pour clarifier la partie ci-dessus sur l'ordre dans lequel vous écrivez les commandes. Supposons que stderr est l'adresse 1002, stdout est l'adresse 1001 et le fichier est 1008. La commande lit de gauche à droite, donc la première chose qu'elle voit dans la vôtre est 2>&1
qui déplace stderr à l'adresse 1001, il voit alors > file
qui déplace stdout à 1008, mais maintient stderr à 1001. Il ne tire pas tout pointant à 1001 et le déplace à 1008, mais fait simplement référence à stdout et le déplace vers le fichier.
Dans l'autre sens, il déplace stdout à 1008, puis déplace stderr au point indiqué par stdout, 1008 également. De cette façon, les deux peuvent pointer vers le fichier unique.
Java -jar myProgram.jar &> output.log &
Notez que le &>
dirige stdout et stderr vers output.log
Arrêt avec <Ctrl+Z>
et continuer en arrière-plan avec bg
équivaut à 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
La commande tee
est également assez répandue.
Nohup Java -jar myProgram.jar | tee output.log &
Au lieu d'utiliser Nohup, vous pouvez utiliser l'écran. Vous pouvez voir l'état du programme en temps réel. vous pouvez même enregistrer toutes les sorties dans un fichier. Il est utile lorsque vous accédez au serveur via ssh où vous vous déconnectez en raison d'une mauvaise connexion ou de l'inactivité. Une fois connecté, vous pouvez continuer le travail là où vous l'avez laissé. reportez-vous this et this pour connaître en détail.