Voici ce que je dois faire:
- démarrer le processus A en arrière-plan
- attendez x secondes
- démarrer le processus B au premier plan
Comment puis-je faire attendre?
Je constate que le «sommeil» semble tout arrêter et je ne veux pas vraiment «attendre» que le processus A se termine complètement. J'ai vu des boucles basées sur le temps, mais je me demande s'il y a quelque chose de plus propre.
sleep
processus A s'arrête? Pouvez-vous montrer le processus de test que vous utilisez ou une sortie indicative de cela? Si processus A est l' arrêt, il est plus probable qu'il essaie de lire à partir du terminal en cours d' exécution en arrière - plan et s'arrêté pour cette raison, plutôt que tout ce qui concernesleep
.process_a </dev/null &
attachera son stdin à/dev/null
plutôt que le TTY, et cela peut être suffisant pour éviter le problème.Réponses:
À moins que je ne comprenne mal votre question, elle peut simplement être réalisée avec ce court script:
(et ajoutez un extra
wait
à la fin si vous voulez que votre script attende pourprocess_a
se terminer avant de quitter).Vous pouvez même le faire en une ligne, sans avoir besoin d'un script (comme suggéré par @BaardKopperud):
la source
bash
de cela, n'importe quel shell fera l'affaire, y compris votre systèmesh
, vous n'avez donc pas besoin d'ajouter une dépendance à bash pour votre script.Vous pouvez utiliser l' opérateur de contrôle en arrière - plan (&) pour exécuter un processus en arrière-plan et la
sleep
commande pour attendre avant d'exécuter un deuxième processus, à savoir:Voici un exemple de deux commandes qui impriment des messages horodatés:
Exécutez-le pour vérifier qu'il présente le comportement souhaité:
la source
J'aime la réponse de @ dr01 mais il ne vérifie pas le code de sortie et vous ne savez donc pas si vous avez réussi ou non.
Voici une solution qui vérifie les codes de sortie.
habituellement je stocke les PID dans un tableau bash, puis la vérification du pid est une boucle for.
la source
A & sleep x; B; ret=$?; wait "$!" || exit "$ret"
process_b
courir au premier plan. Vraisemblablementprocess_a
pourrait quitter pendant l'process_b
exécution, mais vous pouvez toujours lewait
faire et obtenir l'état de sortie après avoir collecté l'état de sortie du premier plan deprocess_b
la manière normale,$?
directement.