2010-08-11 12 views
2

Je souhaite exécuter plusieurs commandes shell avec la commande exec de php. Les commandes doivent être faites séquentiellement et je veux les démarrer avec nohup afin qu'il puisse s'exécuter en arrière-plan et mon script php ne doit pas attendre pour qu'il se termine. Voici mon script:exécuter plusieurs commandes shell avec php nohup

$command1="nohup convert -trim +repage pic1.png pic2.png; convert pic2.png -thumbnail 500x10000 pic3.png; convert pic2.png -resize 115x1000 -gravity Center -crop 115x196+0+0 +repage pic4.png; rm pic1.png; rm pic2.png > /dev/null 2> /dev/null & echo $"; 
$output = exec($command1 . ' 2>&1', $output, $return); 

Comme vous pouvez le voir, il doit être séquentiellement parce que je veux modifier une image qui a été coupé avant. La commande en elle-même et la partie séquentielle fonctionnent bien, mais le nohup ne fonctionne pas sur l'ensemble $ command1. Je ne suis pas sûr si cela ne fait rien ou fonctionne simplement sur la dernière commande (rm pic2.png).

Toute aide est grandement appréciée. Merci

+0

'nohup' devrait fonctionner correctement avec les points-virgules : Voir http://people.ucalgary.ca/~wellings/tipspit/nohup.html pouvez-vous créer un scénario de test avec différentes commandes (comme la création de cinq fichiers subséquents)? Aussi, je pense que si l'une des commandes renvoie une erreur, les autres commandes ne seront pas exécutées (Ne sais pas avec certitude cependant, un expert Linux devra confirmer) –

+0

Je pensais que ça devrait marcher aussi (ça fonctionnait avec une commande sans les points-virgules), mais ce n'est pas le cas ... Donc mon script php attend que la commande se termine au lieu de continuer comme avant ... Btw, je pense que vous avez raison de suivre les commandes ne sont pas exécutées en cas d'erreur. – Michael27

Répondre

2

J'ai résolu mon problème - même si c'est une solution de contournement.

je mets le script shell dans un script batch, que j'appelle de PHP en utilisant exec("nohup batch.sh > /dev/null 2>&1 &");

Dans le script batch j'exécute les commandes shell comme ceci: nohup convert -trim +repage pic1.png pic2.png && nohup convert pic2.png -thumbnail 500x10000 pic3.png &

fonctionne bien!

+0

comment faire cela sans dépendre d'un script shell? – knocte

0

Je suis à me demander cela pendant des années, mais je toujours pensé qu'il n'y a pas d'autre solution que de mettre toutes les commandes dans un script et l'exécuter comme: nohup . ./multiplecommands.sh &

Je ne sais pas pourquoi je n'y suis pas allé plus tôt , mais au moins ce test minuscule a bien fonctionné. Et le shell ne s'arrête pas après une erreur. Si vous remplacez la ; par && je pense qu'il va bien

blup$ nohup echo ett > ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; echo tvaa >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; echo tre >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; echo fyra >> ~/tmptypo/nohup_on_multiple_commands_test_sep_thru_semicolon ; echo fem >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon & 
nohup: ignoring input and redirecting stderr to stdout 
bash: /home/blubber/tmptypo/nohup_on_multiple_commands_test_sep_thru_semicolon: No such file or directory 
[3] 27136 
blub$ ett  #<-- this looks a bit ugly, though, but ignore the additional prompt now. 
tvaa 
tre 
fem 

[3]+ Done     cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon 
blub$ cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolonett 
tvaa 
tre 
fem 
blub$ 

ERGO: echo fyra n'a pas été exécuté, mais echo fem était.

La même chose avec AND = && au lieu de ;

blub2$ nohup echo one > ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon && echo two >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon && echo threefour >> ~/tmptypo/nohup_on_multiple_commands_test_sep_thru_semicolon && echo five >> ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon ; cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon &nohup: ignoring input and redirecting stderr to stdout 
bash: /home/blubber2/tmptypo/nohup_on_multiple_commands_test_sep_thru_semicolon: No such file or directory 
[3] 28744 
blub$ one 
two 

[3]+ Done     cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon 
blub$ cat ~/tmp/nohup_on_multiple_commands_test_sep_thru_semicolon 
one 
two 
blub$ 

ERGO: si vous avez besoin après quit-fail puis utilisez && au lieu de ;

Questions connexes