Exécutez simultanément deux commandes ou plus dans le script shell
Il est souvent très utile d'exécuter des commandes en parallèle dans un script shell, mais je ne trouve pas de moyen de le faire. Est-ce possible? Si oui, comment pourrais-je y parvenir? Je suis principalement intéressé à faire ça pour fish
.
C'est utile lorsque j'exécute des commandes qui prennent beaucoup de temps à se terminer mais qui peuvent ou doivent être exécutées en même temps pour réduire le temps nécessaire pour que tout se termine.
Réponses
L'approche la plus basique est avec &
, cette autre réponse est juste. Il préconise également nohup
mais nohup
redirige stdin, stdout et stderr, quelque chose que vous voudrez peut-être ou non. Lire la différence entre nohup, disownet& et prendre une décision éclairée.
Une autre approche est parallel
. Cela sera utile si les commandes que vous souhaitez paralléliser sont similaires les unes aux autres et que vous pouvez créer un motif.
La variante de base de l'outil (de moreutils
, au moins dans Debian ) vous permet de limiter le nombre de travaux exécutés en même temps. GNUparallel est plus avancé. Si les travaux que vous souhaitez exécuter génèrent une sortie, les options suivantes seront particulièrement utiles:
--group
Sortie de groupe. La sortie de chaque travail est regroupée et n'est imprimée que lorsque la commande est terminée. Stdout (sortie standard) d'abord suivi de stderr (erreur standard). […]
( source )
( --group
est activé par défaut, vous n'avez donc généralement pas besoin de l'utiliser explicitement.)
--keep-order
-k
Gardez la séquence de sortie identique à celle de l'entrée. Normalement, la sortie d'un travail sera imprimée dès la fin du travail. […]-k
N'affecte que l'ordre dans lequel la sortie est imprimée - pas l'ordre dans lequel les travaux sont exécutés.
( source )
Avec eux, la sortie de plusieurs travaux sera organisée, ce que vous ne pouvez pas obtenir &
. Parfois, vous ne vous souciez pas de la sortie mais vous vous souciez toujours de la séquence; comme dans ma réponse où GNU parallel
est utilisé pour paralléliser plusieurs curl
processus et obtenir le statut de sortie de chacun, en conservant la séquence.
Dans Debian, GNU se parallel
trouve dans un paquet nommé parallel
. Comme un exécutable séparé parallel
peut être exécuté à partir de n'importe quel shell.
La meilleure façon de faire est de combiner le nohup
préfacé de la commande avec l' &
ajout à la fin de la commande
Vous ne savez pas quel est votre objectif principal, mais j'espère que cela vous aidera!
Pour exécuter une commande en tant que processus d'arrière-plan sur une machine Linux, vous devez nohupajouter la commande &
au début et l'ajouter à la fin.
La commande finale serait donc:
nohup [your command] &
Les nohup
moyens de la commande doit ignorer « accrochages » et l'esperluette qui y est &
annexé est une commande shell qui indique au système d'exécuter la commande comme processus d'arrière - plan. Vous trouverez plus d'informations sur son utilisation ici .
Lorsque vous exécutez une commande comme celle-ci, le processus s'exécute, vous serez renvoyé à l'invite de commande et vous pouvez quitter la session de terminal ou même faire quelque chose d'autre sans rapport avec cette commande pendant cette session de terminal.