本文介紹如何使用 PHP 腳本監控並守護另一個獨立運行的 PHP CLI 進程(不適用於 Apache 模組或 Nginx + PHP-FPM 模式)。核心思路是讓被守護進程將自身 PID 寫入檔案,守護進程定期讀取 PID 檔案並透過系統指令檢查進程是否存活。
被守護腳本 b.php 啟動時,呼叫 getmypid() 取得目前進程 ID,寫入 c.pid 檔案;正常結束時清空或刪除該檔案。守護腳本 a.php 讀取 PID 檔案,若存在且非空,則執行 ps -p <PID> | grep b.php 確認進程是否仍在運行。為何不直接用 ps aux | grep b.php?因為檔案名稱重複時會誤判,指定 PID 查詢更精準。
<?php
$id = intval($argv[1]);
$pidFile = 'pid' . $id . '.pid';
if (!file_exists($pidFile)) {
echo "not run";
exit;
}
$content = file_get_contents($pidFile);
if (empty($content)) {
echo "not run";
exit;
}
exec("ps p {$content} | grep b.php", $pids);
if (count($pids) > 0) {
echo 'running';
} else {
echo 'not run';
}
?>
<?php
$id = intval($argv[1]);
if (empty($id)) exit;
$pidFile = 'pid' . $id . '.pid';
file_put_contents($pidFile, getmypid());
while (true) {
// 定期更新 PID 檔案,防止被誤判為異常
file_put_contents($pidFile, getmypid());
sleep(100); // 模擬長時間運行任務
}
?>
nohup php b.php 1 > /dev/null 2>&1 & 在背景啟動被守護進程crontab 定時執行 php a.php 1 檢查狀態,若回傳 not run 則重啟此方案輕量、無外部依賴,適合中小型專案的進程自動化管理。