首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 判斷 Linux 程序是否重複運行的兩種實用方法

     編輯:PHP 綜合知識

前言

在 Linux 伺服器上編寫定時腳本時,常會將其加入 crontab 定時執行。隨著時間推移,若腳本執行時間較長,極易出現重複運行導致資源耗盡的問題。本文將分享兩種有效的 PHP 解決方案,幫助開發者防止程序重複執行。

方法一:利用 Linux 進程檢測

此方法通過 shell_exec 執行系統命令,檢查指定腳本是否已在運行:

// 檢測程序是否運行
function ifrun($clsname, $bf = 0) {
    // 獲取進程列表並保存到臨時文件
    $str = shell_exec("/bin/ps ax > /home/root/{$clsname}_run.txt");
    // 統計目標腳本進程數量
    $str = shell_exec("/bin/grep -c '{$clsname}.php' /home/root/{$clsname}_run.txt");
    
    if ($bf > 0) {
        return ($str >= $bf) ? 1 : 0;
    } else {
        // 預設閾值為 2(包含 grep 自身進程)
        return ($str >= 2) ? 1 : 0;
    }
}

// 調用示例:允許最多 5 個同名進程
if (ifrun('pooy', 5)) {
    die("pooy is running");
}
// 備註:pooy 為腳本文件名 pooy.php 的前綴

方法二:進程信息寫入文件匹配

將進程列表導出到文件,再通過 PHP 讀取分析:

system('ps -ef | grep wget > /root/pooy.txt');
$arr = file('/root/pooy.txt');
$total = count($arr);

for ($i = 0; $i < $total; $i++) {
    $count = array();
    // 檢查進程命令中是否包含特定路徑特徵
    if (stristr($arr[$i], 'www/pooy') !== FALSE) {
        $count[] = 'no';
        break;
    }
}

if (count($count) >= 1) {
    echo "A same programs are running";
    exit();
} else {
    echo "start__________________________________________________";
}
// 註:"www/pooy" 為程序命令中的唯一標識字符串

總結

兩種方法各有優勢:第一種靈活可配置並發數;第二種邏輯直觀,適合簡單場景。根據業務需求選擇即可有效解決定時任務重複執行問題。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved