2011-02-08 9 views
8

Penso che ci siano tonnellate di post simili ma non ho ancora trovato una soluzione dopo aver cercato in giro.Shell_exec php with nohup

Fondamentalmente, sto cercando di eseguire due script in background. Quando li ho eseguito nella riga di comando, vedo dopo aver chiamato il mio primo script:

/usr/bin/nohup php script.php > nohupoutput.log & echo $! 

Ho provato ...script.php > /dev/null & con lo stesso risultato. Ottengo:

/usr/bin/nohup: ignoring input and redirecting stderr to stdout 

che ignoro ed eseguo il secondo. Ho notato che sembrava essere appeso lì, e premendo Invio mi ha riportato alla machine:~folder>

/usr/bin/nohup php script2.php > nohupoutput.log & echo $! 

Entrambi gli script funzionano. Ho provato a convertire questo in un comando shell_exec e nulla sembra funzionare. Sospetto che il bit ignoring input stia causando problemi, ma non ne sono sicuro. Indipendentemente da ciò, il seguente non funziona. Si blocca solo nel browser:

$output = shell_exec('/usr/bin/nohup php script.php > /dev/null &'); 
$output = shell_exec('/usr/bin/nohup php script2.php > /dev/null &'); 

risposta

9

Prova:

$output = shell_exec('/usr/bin/nohup php script.php >/dev/null 2>&1 &'); 

Oppure:

exec('/usr/bin/nohup php script.php >/dev/null 2>&1 &'); 
+0

sto diventando un redirect uscita ambiguo quando provo sia sulla riga di comando. – Rio

+0

quale sistema operativo stai usando e versione php? questo è strano. –

2

Questo lavoro Shoul:

shell_exec('nohup /usr/bin/php path/to/script.php > output.txt &'); 
2
this would help you dude.. 


<?php 

function execInBackground($cmd) { 
    if (substr(php_uname(), 0, 7) == "Windows"){ 
     pclose(popen("start /B ". $cmd, "r")); 
    } 
    else { 
     exec($cmd . " > /dev/null &"); 
    } 
} 
//take note: to get your PHP_PATH, try looking at your phpinfo :) 
echo execInBackground("/usr/local/php53/bin/php 'example2.php'"); 

?> 

questo è la mia pagina di esempio di lavoro: () ****http://affiliateproductpromotions.net/pop.php*****()

+1

'popen ('nohup ... &', 'r')' è l'unico metodo che funziona per me sia in OS X che in Heroku. Un sacco di altre soluzioni per l'esecuzione di processi in background separati incl. Symfony, Cocur e altri fallirono (o bloccarono l'esecuzione o morirono quando il genitore muore). –