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觸發)。
鍵盤信號被髮送到進程組中的所有進程。您需要fork並使用'posix_setsid()',以便'system()'運行在不同的進程組中。 – Barmar
解釋它!謝謝。這將是答案......我根本無法做我想要的東西而不分叉。 –