bash: lancer plusieurs commandes chaînées en arrière-plan
J'essaie de l'exécuter certaines commandes en parallèle, dans le fond, à l'aide de bash. Voici ce que j'essaie de faire:
forloop {
//this part is actually written in perl
//call command sequence
print `touch .file1.lock; cp bigfile1 /destination; rm .file1.lock;`;
}
La partie entre backticks (`) donne naissance à un nouveau shell et exécute les commandes dans la succession. La chose est, le contrôle de l'origine programme renvoie seulement après la dernière commande a été exécutée. Je tiens à exécuter l'intégralité de la déclaration en arrière-plan (je ne suis pas attendre quelque chose en sortie/les valeurs de retour) et je voudrais la boucle pour continuer à fonctionner.
Le programme appelant (celui qui a la boucle) n'aurait pas de fin jusqu'à ce que tous les engendré des coquilles de finition.
Je pourrais utiliser des threads en perl pour frayer les différents threads qui appelle les différentes coquilles, mais il semble inutile...
Puis-je lancer un interpréteur de commandes, de lui donner un ensemble de commandes et dites lui d'aller à l'arrière-plan?
Vous devez vous connecter pour publier un commentaire.
Je n'ai pas testé cela, mais que diriez -
Les parenthèses signifient exécuter dans un shell interne est exécuté, mais qui ne devrait pas faire de mal.
Grâce Hugh, qu'il a fait:
Les autres idées ne fonctionnent pas parce qu'ils commencent chaque commande en arrière-plan, et non pas la séquence de commande (ce qui est important dans mon cas!).
Merci encore!
sleep 3
vous faire économiser un peu de temps dans le débogage?Un autre moyen est d'utiliser la syntaxe suivante:
Noter que le
&
va à la fin de la commande de groupe, pas après chaque commande. Le point-virgule après la dernière commande est nécessaire, tout comme l'espace après le premier support et avant la finale de support. Lewait
à la fin assure que le processus parent n'est pas tué avant la donné naissance à l'enfant (le groupe de commande) se termine.Vous pouvez aussi faire de la fantaisie des trucs comme la redirection
stderr
etstdout
:Votre exemple serait:
L'esperluette à la fin de la commande s'exécute en arrière-plan, et le
wait
attend jusqu'à ce que la tâche d'arrière-plan est terminé.GavinCattell obtenu le plus proche (pour bash, OMI), mais comme Mad_Ady l'a souligné, il ne gère pas le "verrouillage" des fichiers. Cela devrait:
Si il y a d'autres emplois dans l'attente, le attendre va attendre pour ceux, trop. Si vous avez besoin d'attendre pour seulement les copies, vous pouvez accumuler les Pid et d'attendre que les. Si pas, vous pouvez supprimer les 3 lignes avec "pid", mais c'est plus général.
En outre, j'ai ajouté de la vérification pour éviter la copie au total:
D'ailleurs, on dirait que vous êtes la copie des nouveaux fichiers sur un FTP référentiel (ou similaire). Si oui, vous pourrait envisager un copier/renommer stratégie au lieu de les fichiers de verrouillage (mais c'est un autre sujet).
L'installation de bash que vous cherchez s'appelle
Compound Commands
. Voir la page de man pour plus d'info:Il en existe d'autres, mais ce sont probablement les 2 types les plus courants. La première, parens, se déroulera une liste de commande en série dans un shell interne est exécuté, tandis que le second, les accolades, une liste de commandes en série dans le shell courant.
parens
accolades
Exécutez la commande par l'aide à l'emploi:
Le résultat sera envoyé à votre compte par mail.
Je suis tombé sur ce fil de discussion ici et a décidé de mettre un extrait de code pour frayer enchaîné les déclarations en tâche de fond. J'ai testé cela sur BASH pour Linux, KSH pour IBM AIX et Busybox est de la CENDRE pour Android, donc je pense qu'il est sûr de dire qu'il travaille sur tout Bourne-shell.
Ce code s'exécute un certain nombre de tâches en arrière-plan jusqu'à une certaine limite de connexions simultanées emplois. Vous pouvez l'utiliser, par exemple, pour recompresser beaucoup de format de fichiers avec
xz
sans avoir un énorme bouquet dexz
processus de manger la totalité de votre mémoire et faire de votre ordinateur de vomir: dans ce cas, vous utilisez*
comme lefor
la liste et le travail par lots seraitgzip -cd "$X" | xz -9c > "${X%.gz}.xz"
.exécuter les commandes dans un shell interne est exécuté:
Essayer de mettre les commandes dans des accolades avec des &s, comme ceci:
Ce n'est pas de créer un sous-shell, mais exécute les commandes du groupe en arrière-plan.
HTH
Je ne sais pas pourquoi personne n'a répondu avec la solution appropriée:
Cela provoque Perl pour frayer les enfants à l'exécution de chaque commande, et vous permet d'attendre que tous les enfants avant de poursuivre.
Par la voie,
et
sortie le même contenu sur la sortie standard, mais le premier a une hausse des frais généraux, comme Perl a capturer tous "
some command
"sortie de l'De bifurquer dans une boucle for:
for i in x; do ((a; b; c;)&); done
Exemple:
for i in 500 300 100; do ((printf "Start $i: "; date; dd if=/dev/zero of=testfile_$i bs=1m count=$i 2>/dev/null; printf "End $i: "; date;)&) && sleep 1; done
Juste au cas où que quelqu'un est toujours intéressé, vous pouvez le faire sans faire appel à un shell interne est exécuté comme ceci:
Vous pouvez utiliser GNU
parallel
commande à exécuter des tâches en parallèle. Il est plus en sécurité au plus vite.Ma conjecture est que vous essayez de copier plusieurs fichiers volumineux à partir de la source à la destination. Et pour cela, vous pouvez le faire en parallèle avec la déclaration ci-dessous.
Que nous avons utilisé
-j0
option, tous les fichiers seront copiés en parallèle. Dans le cas où si vous avez besoin de réduire le nombre de processus en parallèle, alors vous pouvez utiliser-j<n>
où<n>
est le nombre de processus en parallèle pour être exécuté.Parallèle permettra également de recueillir la sortie du processus et d'en faire rapport de façon séquentielle (avec
-k
option), qui d'autre emploi mécanisme de contrôle ne peut pas faire.--eta
option va vous donner les détails de la statistique du processus qui est en cours. Afin que nous puissions savoir comment peut-ont été complétées et combien de temps cela prend-il pour obtenir terminée.Vous pouvez passer des paramètres à un groupe de commandes (ayant séquentiel commandes) et de les exécuter en arrière-plan.