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
bash
shell
shell-script
djangofan
la source
la source
2>$1
est probablement censé être2>&1
.Réponses:
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 à
et ensuite vous pouvez lancer le & pour l'envoyer à l'arrière-plan. Les travaux peuvent être consultés avec la
jobs
commande.jobs
va vous montrer les travaux en cours, et les numéroter. Vous pouvez ensuite parler des emplois en utilisant un% suivi du nombre,kill %1
ou à peu près .De plus, sans le & on vous pouvez suspendre la commande avec Ctrlz, utilisez la
bg
commande pour la mettre en arrière-plan et lafg
ramener au premier plan. En combinaison avec lajobs
commande, 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>&1
qui 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.
la source
$!
&> file.out
pour rediriger stdin et stdout vers un fichier de sortie, ce qui réduit les risques d'erreur2>&1
lors de l'insertion au mauvais endroit de votre ligne de commande.Arrêter avec
<Ctrl+Z>
et continuer en arrière-planbg
est équivalent à exécuter avec&
à la fin de la commande.Donc, pour exécuter en arrière-plan et rediriger la sortie:
Si vous avez également besoin que cette commande ne meure pas lorsque vous quittez le terminal, vous devez utiliser
nohup
la source
&
bg
, vous pouvez le dissocier de votre session en le lançantdisown
, ce qui signifie que le processus ne meurt pas lorsque vous fermez le terminal.Notez que la commande
&>
dirige stdout et stderr vers output.logla source
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.
la source
La
tee
commande est assez répandue aussi.nohup java -jar myProgram.jar | tee output.log &
la source