2016-03-08 69 views
0

我有一個守護進程腳本,當我ctrl-c調用我的信號,但不是在我的「系統」調用立即退出之前。我處理信號的關鍵是在退出無限循環之前讓「系統」調用正常完成。 如何停止從系統調用中退出命令?kill在觸發之前退出系統調用pcntl_signal

declare(ticks=1) 

function exitFunction($signo) { 
    global $pidFile, $exit; 
    unlink($pidFile); 
    echo "Daemon is exiting (signal: $signo). Removing pidFile: $pidFile\n"; 
    $exit = true; 
}; 
//create the signal handler and shutdown function 
pcntl_signal(SIGINT, "exitFunction"); 
pcntl_signal(SIGTERM, "exitFunction"); 

//create the pid file with our command 
file_put_contents($pidFile, posix_getpid()); 

echo "pid: " . posix_getpid() . "\n"; 
echo "Time to start!\n"; 
while(!$exit) { 
    echo "running $command...\n"; 
    system($command, $return); 
    echo "done $command\n"; 
    if($return) { 
     echo "didn't find any domains with command, so sleeping for 60...\n"; 
     sleep(60); 
    } 
} 

注意:如果無法處理來自「系統」的信號而無需分叉,請告訴我,我將使用分叉。我避免分叉,因爲IMO使得邏輯更復雜,所以考慮到守護進程的連續性,我想我應該明智地避免它。

編輯:實現ctrl-c不同於殺。如果我使用kill,那麼一切都按預期工作,但如果我按ctrl-c,系統調用不管捕捉信號如何(注意:信號IS仍然由ctrl-c觸發)。

+1

鍵盤信號被髮送到進程組中的所有進程。您需要fork並使用'posix_setsid()',以便'system()'運行在不同的進程組中。 – Barmar

+0

解釋它!謝謝。這將是答案......我根本無法做我想要的東西而不分叉。 –

回答

0

這是不可能沒有分叉。

相關問題