[PHP] commando's op achtergrond uitvoeren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 19:29
Ik wil met PHP en de exec() functie een aantal commando's uitvoeren op de server.
Het script wordt via de webserver aangeroepen, en daarom wil het de commando's op de achtergrond uitvoeren. Ik hoef namelijk geen commandline output terug.

Het is echter van belang dat de commando's in de juiste volgorde worden uitgevoerd. Een bash script zou optimaal zijn, maar aangezien de commando's dynamisch zijn is dit niet handig.

Ik heb gelezen dat je commando's in exec() met een semicolon (;) kunt scheiden, maar de vraag blijft dan hoe je deze reeks commando's op de achtergrond kan uitvoeren.

Het meest ideale zou zijn als ik met PHP on the fly een bash script kon genereren die dan door de server wordt uitgevoerd.

Heeft iemand hier ideeen over?

Ik blijf er iig vrij nuchter onder....


Acties:
  • 0 Henk 'm!

  • om3ega
  • Registratie: Maart 2001
  • Laatst online: 00:11
Misschien heb je wat aan dit topic?

[rml][ PHP] PHP script starten vauit een Script[/rml]

Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 19:29
Nee, dat gaat niet om het uitvoeren van meerdere commando's.

Ik weet ook wel hoe ik een script op de achtergrond moet draaien. Een voorbeeldje van de commando's:

/bin/mv temp1 temp2
/bin/ln -s temp3 temp1

Zoals je ziet is het dus van uiterst belang dat eerst temp1 naar temp2 gemoved wordt, alvorens er een symlink naar temp3 gemaakt wordt, met de naam temp1. Als ze parallel worden uitgevoerd, dan wordt temp1 overschreven..

Ik dacht dus meer aan iets als dit:
exec('/bin/mv temp1 temp2; /bin/ln -s temp3 temp1> /dev/null 2>&1 &);

Maar ik vrees dat nu alleen de ln -s actie op de achtergrond gaat draaien. Het effect is dus hetzelfde als wanneer ik 2 exec()'s gebruik..

Ik blijf er iig vrij nuchter onder....


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
maartenvdv schreef op maandag 16 januari 2006 @ 12:08:
Nee, dat gaat niet om het uitvoeren van meerdere commando's.

Ik weet ook wel hoe ik een script op de achtergrond moet draaien. Een voorbeeldje van de commando's:

/bin/mv temp1 temp2
/bin/ln -s temp3 temp1

Zoals je ziet is het dus van uiterst belang dat eerst temp1 naar temp2 gemoved wordt, alvorens er een symlink naar temp3 gemaakt wordt, met de naam temp1. Als ze parallel worden uitgevoerd, dan wordt temp1 overschreven..

Ik dacht dus meer aan iets als dit:
exec('/bin/mv temp1 temp2; /bin/ln -s temp3 temp1> /dev/null 2>&1 &);

Maar ik vrees dat nu alleen de ln -s actie op de achtergrond gaat draaien. Het effect is dus hetzelfde als wanneer ik 2 exec()'s gebruik..
waarom gebruik je niet de output van het 'exec' commando?
dus

PHP:
1
2
3
if (exec(blaat) != "") {
exec(blaat2);
}

(weet niet zeker of het werkt, maar is het proberen waard)

edit:
verder kan je denk ik ook dit doen:
exec('/bin/mv temp1 temp2 | /bin/ln -s temp3 temp1> /dev/null 2>&1 &);

waar de | gewoon een pipe is zoals je die ook op de commandline gebruikt

[ Voor 13% gewijzigd door BasieP op 16-01-2006 12:13 ]

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • Erkens
  • Registratie: December 2001
  • Niet online

Erkens

Fotograaf

BasieP schreef op maandag 16 januari 2006 @ 12:12:
exec('/bin/mv temp1 temp2 | /bin/ln -s temp3 temp1> /dev/null 2>&1 &);

waar de | gewoon een pipe is zoals je die ook op de commandline gebruikt
waarom een pipe :?

exec('/bin/mv temp1 temp2 && /bin/ln -s temp3 temp1');

zo wordt de symlink alleen gemaakt indien de mv niet failed ;)

ow, en in de background met & is niet handig vanuit een PHP script, je script kan immers al weg zijn voordat je commando's klaar zijn waardoor die gekilled worden.

[ Voor 22% gewijzigd door Erkens op 16-01-2006 12:45 ]


Acties:
  • 0 Henk 'm!

  • BasieP
  • Registratie: Oktober 2000
  • Laatst online: 22-07-2024
omdat ik onvoldoende kennis heb van linux om te weten wta && doet (nu dus wel)

This message was sent on 100% recyclable electrons.


Acties:
  • 0 Henk 'm!

  • maartenvdv737
  • Registratie: Augustus 2000
  • Laatst online: 19:29
Erkens schreef op maandag 16 januari 2006 @ 12:44:
[...]

waarom een pipe :?

exec('/bin/mv temp1 temp2 && /bin/ln -s temp3 temp1');

zo wordt de symlink alleen gemaakt indien de mv niet failed ;)

ow, en in de background met & is niet handig vanuit een PHP script, je script kan immers al weg zijn voordat je commando's klaar zijn waardoor die gekilled worden.
Ok, daar kan ik bij. Het nadeel is echter, als een proces blijft hangen dat door exec wordt aangeroepen, dat het apache proces vast loopt. Hierdoor ontstaan er op den duur te veel apache processen, waardoor de server vast loopt.

Het moet toch mogelijk zijn een proces te laten draaien als de verbinding met apache weg is.
Kan dat niet met een "nohup" o.i.d.?

Moet ik dan een nohup een elk commando meegeven? Waar moeten de background commands?
exec( nohup /bin/mv bla bla && nohup /bin/ln -s bla bla > /dev/null 2>&1 & );

[ Voor 16% gewijzigd door maartenvdv737 op 16-01-2006 17:56 ]

Ik blijf er iig vrij nuchter onder....

Pagina: 1