Exécution de plusieurs commandes nohup en arrière-plan

12

Vous avez deux commandes cmd1 et cmd2. Des deux, cmd2 met plus de temps à terminer. Besoin d'exécuter cmd2 puis cmd1.

J'ai essayé de les exécuter de la manière suivante:

bash$ (nohup ./cmd2>result2 &) && nohup ./cmd1>result1 &

ou

bash$ (nohup ./cmd2>result2 &) ; nohup ./cmd1>result1 &

Mais les deux fois où je peux voir cmd1 n'attend pas la fin de cmd2 et le résultat1 est rempli.

Comment faire tourner cmd1 après cmd2 alors que les deux devraient être un processus nohup et s'exécuter en arrière-plan?

user33767
la source
Cette question est déjà posée unix.stackexchange.com/questions/67006/…
Rahul Patil
2
La question dans le unix.stackexchange.com/questions/67006/… est légèrement différente car je voulais maintenir mon ordre d'exécution. Veuillez me corriger si je me trompe dans la compréhension de l'autre question.
user33767

Réponses:

12

Vous avez fait les deux cmd1et cmd2couru en parallèle. Vous avez dit: «Démarrez cmd2 en arrière-plan et supprimez toute association avec lui. Démarrez cmd1 en arrière-plan et supprimez toute association avec lui. » Vous vouliez dire: «Démarrez cmd2 en arrière-plan; une fois terminé, démarrez cmd1 (également en arrière-plan). » Puisqu'il n'y a plus d'association avec la tâche d'arrière-plan, vous devez concevoir une tâche d'arrière-plan qui exécute cmd2 puis cmd1. C'est cmd2; cmd1(ou plutôt cmd2 && cmd1pour exécuter cmd1 uniquement si cmd2 réussit), et vous devrez dire nohupde démarrer un shell en arrière-plan pour cela.

nohup sh -c './cmd2 >result2 && ./cmd1 >result1' &
Gilles 'SO- arrête d'être méchant'
la source
Merci. Cela fonctionne bien. Oui, c'est ce que je pensais, après avoir fait passer la première cmd en arrière-plan, cela n'affecte pas la deuxième commande, qui démarre même si je voulais qu'elle attende que la première commande se termine. J'ai besoin de lire le manuel sur l'envoi de la commande en arrière-plan.
user33767
3

Si cela ne vous dérange pas de ne pas utiliser nohup:

{ command1 >result1 2>&1 && command2 >result2 2>&1 ; } & disown
artyom
la source
Va vérifier cela. Mais actuellement ira avec la réponse de Giles où la commande est enveloppée avec sh. Merci quand même
user33767
C'est une mauvaise idée. Lorsque l'utilisateur se déconnecte de la console, cela tue la session.
mootmoot
@mootmoot cela fonctionne comme prévu, vérifiez par vous-même; les commandes ne recevront pas SIGHUP à la fermeture du shell parent.
artyom
Oui, le shell est protégé si vous exécutez la commande à l'aide de crond / crontab. Mais ce n'est pas sûr pty / xterm / ssh. unix.stackexchange.com/questions/3886/…
mootmoot
2

Utilisez simplement:

nohup ./cmd2>result2 & nohup ./cmd1>result1 & nohup ./cmd3>result3 &
Rahul Patil
la source
Bien que l'exécution de la commande multiple soit correcte, je voulais maintenir l'ordre exact d'exécution, c'est-à-dire d'abord cmd2 puis cmd1 et cela ne se produit pas avec la commande ci-dessus. merci
user33767
0

dites-nous ce que vous faites exactement avec cmd2 et cmd1. Cela dépend du type de tâche et de la sortie que vous souhaitez à partir de votre commande. Si vous rencontrez un problème avec le fait d'appuyer deux fois sur la touche Entrée avec la commande, cela peut être compris par mon ce message

vous pouvez aussi suivre cette voie

nohup `cmd2 && ccmd1` > Output.out 2> Error.err < /dev/null & 

Voir la capture d'écran ci-dessous, ici, j'utilise 3 commandes et toutes sont exécutées une par une en série. J'ai utilisé des backticks pour cette tâche. En capture d'écran, vous pouvez également observer l'horodatage de la date. la commande sleep a 60 secondes, donc après 60 secondes ma prochaine commande est exécutée avec succès. J'ai utilisé la commande jobs pour vérifier si une commande est toujours en cours d'exécution en arrière-plan. Ici non. des emplois que vous pouvez voir est de 1.

nohup-multiple-command

Cette capture d'écran est également disponible dans ce lien , si elle n'est pas visible

Sharad Chhetri
la source