2012-08-02 84 views
0

代碼:PHP - 檢查,看是否有腳本運行它,循環瀏覽器永遠

exec('ps aux |grep tweet',$output,$return_var); 
if(count($output)>0){ 
    exec('php ' . DOCROOT . 'gremlins/tweet_gremlin.php &'); 
    file_put_contents(DOCROOT . 'gremlins/tweet_gremlin.log', date('r') . ' Tweet Gremlin was not running. Starting now...'); 
} 

在我的頭上,這個代碼是有意義的,但它只是使瀏覽器無限循環。我試圖做的是檢查tweet_gremlin.php是否正在運行,如果它沒有運行,啓動它。 DOCROOT是代碼中較早定義的一個常量。

+0

可能導致無限循環的唯一行是'exec('php'...)''。那個腳本是做什麼的? – 2012-08-02 17:29:03

+3

您的'if'語句告訴PHP只有在它已經運行時才運行'tweet_gremlin.php'。 – Palladium 2012-08-02 17:29:52

+0

@Palladium我認爲這只是其中的一部分,如果頁面「無限循環」,可能是因爲php腳本的exec正在等待它完成(看起來像一個守護進程)。如果是這種情況,你可能需要做一些事情,比如'exec('php yourfile.php >>/dev/null 2>&1&')'。雖然沒有嘗試過。 – tigrang 2012-08-02 17:36:15

回答

1

你可以使用:

if (!exec("ps aux | grep tweet | grep -v grep")) { 
    // do something 
} 

grep -v部分從列表中刪除grep過程。

此外,要執行exec等後臺進程,您需要重定向輸出,否則腳本將掛起,直到進程結束。每例如:

exec('php script.php >/dev/null &'); 
+0

這似乎是工作,但如果我把 執行exec(「PHP」。DOCROOT。「小鬼/ tweet_gremlin.php &'); 進入死循環,瀏覽器永遠循環。我需要做某種連字符轉義的? – Chad 2012-08-03 17:19:27

+0

@cwscribner:因爲你不能以這種方式執行後臺進程。查看更新後的答案。 – netcoder 2012-08-03 17:38:46

2

我發現的一件事是,有時候你做ps -aux | grep "something"總是有一個過程。這個過程基本上就是你自己的命令!因此在使用php之前,先在shell中嘗試一下命令。

+1

+1賓果...我忽略了自己。你是對的,grep總會發現自己。如果該代碼片段** IS ** tweet_gremlin腳本,則它會一遍又一遍地調用它自己。 – 2012-08-02 17:31:21

0

你或別人可能覺得這是有用的,它是一個腳本香港專業教育學院寫了很久以前

<?php 
// shut system if wget is not running 

function rempty($tbl) 
{ 
    foreach ($tbl as $key => $val) 
    { 
     if (trim($val) == '') 
      unset ($tbl[$key]); 
    } 

    return $tbl; 
} 

while (count(rempty(explode("\n",trim(shell_exec('pgrep wget'))))) > 0) 
    sleep(1); 

echo 'done. shutting down in 30 mins...'; 
sleep (30*60); 
shell_exec('sudo halt'); 

?> 
1

我想是因爲你要測試如果這個過程是不是有正確的您可能需要嘗試

if(count($output)==0)