Aller au contenu
captain_torche

Script SH pour lancer en parallèle plusieurs commandes

Noter ce sujet :

Recommended Posts

Je vais avoir besoin de lancer plusieurs scripts PHP en parallèle, je voulais savoir si je pouvais faire un script sh pour me simplifier la tâche



Dans le principe, je dois lancer plusieurs scripts PHP qui se présentent de la manière suivante :


script.php 1 20


script.php 21 40


script.php 41 60



etc, pour environ 300 occurrences



Il va falloir que j'utilise screen pour éviter de perdre l'exécution, mais je me demandais :


- dois-je simplement faire un screen et y lancer un script sh qui me les lance tous, ou


- puis-je faire un script sh qui m'ouvre un screen par script à exécuter ? Et, dans ce dernier cas, comment faire ?


Partager ce message


Lien à poster
Partager sur d’autres sites

Un script comme ceci si tu as besoin de 2 arguments comme dans ton exemple ? Edite la limite de 300 ou remplace-la par une variable..



#!/bin/bash
low=1
high=20
while [ $low -lt 300 ]
do
screen ton_script.php $low $high &
low=$((low+20))
high=$((high+20))
done

Partager ce message


Lien à poster
Partager sur d’autres sites

A mon sens il faut supprimer le '&' en fin de commande, car screen doit être connecté à un terminal


Partager ce message


Lien à poster
Partager sur d’autres sites

Pour lancer une flopée de scripts en parallèle, tu peux remplacer la ligne "screen..." par une ligne comme ceci :



nohup ton_script.php $low $high &

Si tu as des messages, ils seront tous répertoriés dans nohup.out ... pour tous tes scripts.


Ca risque d'être donc peu lisible.

Partager ce message


Lien à poster
Partager sur d’autres sites

Le & sert à lancer un process en tâche de fond...


Mais il reste associé au terminal qui l'a lancé.



En mettant nohup devant la commande (et & à la fin) on lance une commande en tâche de fond, en la dissociant du terminal.



Tu peux voir les commandes en tâche de fond en lançant "jobs". Elles sont numérotées, et tu peux les ramener sur le devant de la scène avec la commande fg



Exemple :



ns1.xxx:root# nohup sleep 300 &
[1] 16679
nohup: les entrées sont ignorées et la sortie est ajoutée à « nohup.out »
ns1.xxx:root# nohup sleep 200 &
[2] 16697
nohup: les entrées sont ignorées et la sortie est ajoutée à « nohup.out »
ns1.xxx:root# jobs
[1]- En cours d'exécution nohup sleep 300 &
[2]+ En cours d'exécution nohup sleep 200 &
ns1.xxx:root# fg %2
nohup sleep 200
^Z
[2]+ Stoppé nohup sleep 200
ns1.xxx:root# bg %2
[2]+ nohup sleep 200 &

Lorsqu'une commande est en avant plan, tu peux la stopper avec CTRL-Z et la mettre en arrière plan avec "bg"



Et tu peux attendre la fin de toutes tes commandes lancées en tâche de fond avec "wait" qui ne te rendra la main qu'une fois toutes les commandes


terminées.



ns1.xxx:root# wait
[1]- Fini nohup sleep 300
[2]+ Fini nohup sleep 200
ns1.xxx:root#

Tu peux aussi "tuer" une commande en lançant un "kill %2" (le %2 étant exemplatif, et dépendant du numéro de la commande à terminer)



J'espère que je l'ai bien expliqué wink.gif


  • Vote 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Parfaitement !


Ca revient (Pour en revenir au screen) à lancer les commandes dans un screen avec un & à la fin ?


Partager ce message


Lien à poster
Partager sur d’autres sites

Disons que c'est une manière différente de lancer des process en tâche de fond wink.gif



Perso, je ne suis pas un fanatique du "screen", même si je reconnais qu'il est très puissant. Trop peut-être pour mes besoins.


Partager ce message


Lien à poster
Partager sur d’autres sites

Créer un compte ou se connecter pour commenter

Vous devez être membre afin de pouvoir déposer un commentaire

Créer un compte

Créez un compte sur notre communauté. C’est facile !

Créer un nouveau compte

Se connecter

Vous avez déjà un compte ? Connectez-vous ici.

Connectez-vous maintenant

×