2013-03-09 85 views
0
新的進程,我似乎

不能使用系統()來創建一個持久,分叉過程:(是的,則params都OK)傳遞參數在PHP

$args = "/code/perl/test/run $a $n $m $s $c &"; 
system($args); 

但是,從另一面驗證碼是否可以工作,但它沒有參數:

system("/code/perl/test/reset &"); 

那麼,這個問題呢?我的C程序「運行」在HTTP請求完成PHP腳本後立即死亡。

我已經嘗試使用守護進程創建使用單獨的父進程的過程,但沒有成功。 www-data已從/etc/at.deny中刪除

值得注意的是,在第二個例子中,我確實得到了程序輸出,但不是第一個。

回答

1

從文檔:

如果一個程序是用這種方式啓動,以便它繼續 在後臺運行,該程序的輸出必須 重定向到文件或其他輸出流。如果不這樣做, 會導致PHP掛起,直到程序執行結束。

因此,如果它立即結束,很可能不會出現run正在運行。嘗試將輸出發送到不同的文件。嘗試:exec("/bin/echo $a $n $m $s $c > /tmp/echo &");開始診斷。

之後,我會檢查safe_mode並嘗試escapeshellcmd。作爲最後的手段,請嘗試反向操作員`

+0

「奔跑」絕對是奔跑。問題是,PHP或其他的東西正在結束它,任務應該被允許繼續。 – Saustin 2013-03-09 21:10:57

+0

您是否在不允許後臺任務的主機上,或者您處於不受控制的環境中? – jnovack 2013-03-10 11:08:15

+0

不,這是我自己的擁有完全根訪問權限的VPS。作爲一個更具迴避性的解決方法,我編寫了一個需要單獨運行的守護進程。希望我不會忘記運行它。然而,對於escapeshellcmd,請使用 – Saustin 2013-03-10 15:03:15

0

這是PHP腳本完成的結果,然後殺死所有附加到它的子進程。

如果「at」解決方法不起作用(您使用atd將其安排爲「現在」),就像它不適合我一樣,您可能必須編寫解決方法。我的解決方法是將命令放在/ tmp /中的一個文件中,然後讓守護進程的代碼執行文件中的命令,然後截斷它。