Hướng dẫn php check process is running - quá trình kiểm tra php đang chạy

Như một cách để xây dựng cơ quan giám sát của một người nghèo và đảm bảo một ứng dụng được khởi động lại trong trường hợp nó gặp sự cố (cho đến khi tôi tìm ra lý do tại sao), tôi cần viết một tập lệnh PHP CLI sẽ được chạy bởi cron mỗi 5 triệu vẫn đang chạy.

Dựa trên trang này, tôi đã thử mã sau, nhưng nó luôn trả về đúng ngay cả khi tôi gọi nó bằng dữ liệu không có thật:

function processExists($file = false) {
    $exists= false;
    $file= $file ? $file : __FILE__;

    // Check if file is in process list
    exec("ps -C $file -o pid=", $pids);
    if (count($pids) > 1) {
    $exists = true;
    }
    return $exists;
}

#if(processExists("lighttpd"))
if(processExists("dummy"))
    print("Exists\n")
else
    print("Doesn't exist\n");

Tiếp theo, tôi đã thử mã này ...

(exec("ps -A | grep -i 'lighttpd -D' | grep -v grep", $output);)
print $output;

... Nhưng đừng hiểu những gì tôi mong đợi:

/tmp> ./mycron.phpcli 
Arrayroot:/tmp> 

FWIW, tập lệnh này được chạy với phiên bản CLI của Php 5.2.5 và HĐH là UCLINUX 2.6.19.3.

Cảm ơn bạn cho bất kỳ gợi ý.


Chỉnh sửa: Điều này có vẻ hoạt động tốt

exec("ps aux | grep -i 'lighttpd -D' | grep -v grep", $pids);
if(empty($pids)) {
        print "Lighttpd not running!\n";
} else {
        print "Lighttpd OK\n";
}

Bỏ qua nội dung

Kiểm tra xem một quá trình có đang chạy trên hệ thống Linux như Ubuntu bằng cách sử dụng PHP không. Điều này được thực hiện bằng cách sử dụng PGREP và kiểm tra xem phản hồi của nó có trống không.

PGREP xem qua các quy trình đang chạy hiện đang chạy để phù hợp với tiêu chí tìm kiếm, tiêu chí tìm kiếm là những gì xuất hiện sau PGREP.

Để kiểm tra FFMPEG chạy, bạn sẽ thực hiện PGREP FFMPEG và nó sẽ trả về tất cả các quy trình ID (PID) cho các trường hợp chạy FFMPEG.

echo shell_exec("pgrep youtube-dl");

Lệnh trên là nếu YouTube-DL có ít nhất một trường hợp chạy thì ID/s quy trình sẽ được trả về.

Bây giờ để kiểm tra chỉ cần trả về có hoặc không khi quá trình chạy:

if (empty(trim(shell_exec("pgrep youtube-dl")))) {
    echo "No";
} else {
    echo "Yes";
}

Nếu YouTube-DL không chạy thì shell_exec sẽ trống vì nó không trả lại PID, nó sẽ không trả lại trong trường hợp này.

Ở đây, nó được đưa vào một chức năng có thể được sử dụng lại các tên quy trình khác nhau, tức là ffmpeg, wget, php, v.v.

function processRunning(string $process): bool
{
    if (empty(trim(shell_exec("pgrep $process")))) {
        return false;
    } else {
        return true;
    }
}

Trang chủ / Kiểm tra xem tập lệnh PHP có chạy khôngCheck if a PHP script is already running

Nếu bạn có các quy trình hàng loạt chạy dài với PHP do Cron điều hành và bạn muốn đảm bảo chỉ có một bản sao chạy của tập lệnh, bạn có thể sử dụng các hàm getMypid () và posix_kill () để kiểm tra xem bạn đã có bản sao của quá trình chạy. Bài đăng này có một lớp PHP để kiểm tra xem tập lệnh có chạy không.

Mỗi quá trình chạy trên máy tính Linux/Unix có PID hoặc Định danh quy trình. Trong PHP, điều này có thể được truy xuất bằng cách sử dụng getMypid () sẽ trả về số nguyên. Số PID này có thể được lưu vào một tệp và mỗi khi tập lệnh được chạy, một kiểm tra được thực hiện để xem liệu tệp có tồn tại không. Nếu đó là hàm posix_kill () có thể được sử dụng để xem liệu một quá trình có chạy với số PID đó không.

Lớp PHP của tôi để làm điều này là dưới đây. Xin vui lòng sử dụng điều này và sửa đổi để phù hợp với các yêu cầu cá nhân của bạn.

class pid {

    protected $filename;
    public $already_running = false;
   
    function __construct($directory) {
       
        $this->filename = $directory . '/' . basename($_SERVER['PHP_SELF']) . '.pid';
       
        if(is_writable($this->filename) || is_writable($directory)) {
           
            if(file_exists($this->filename)) {
                $pid = (int)trim(file_get_contents($this->filename));
                if(posix_kill($pid, 0)) {
                    $this->already_running = true;
                }
            }
           
        }
        else {
            die("Cannot write to pid file '$this->filename'. Program execution halted.n");
        }
       
        if(!$this->already_running) {
            $pid = getmypid();
            file_put_contents($this->filename, $pid);
        }
       
    }

    public function __destruct() {

        if(!$this->already_running && file_exists($this->filename) && is_writeable($this->filename)) {
            unlink($this->filename);
        }
   
    }
   
}

và nó có thể được sử dụng như sau:

$pid = new pid('/tmp');
if($pid->already_running) {
    echo "Already running.n";
    exit;
}
else {
    echo "Running...n";
}

Để kiểm tra nó, bạn có thể thêm "giấc ngủ (30);" Đến cuối tập lệnh kiểm tra ở trên, chạy tập lệnh và sau đó chạy lại tập lệnh. Lần thứ hai bạn chạy nó, tập lệnh sẽ xuất ra "đã chạy" và thoát.

Lớp điều chỉnh tệp PID ở cuối tập lệnh tự động chạy trong DesctRuctor, vì vậy tất cả những gì bạn cần làm là tạo đối tượng khi bắt đầu và sau đó kiểm tra xem nó có chạy không.

CẬP NHẬT 29 tháng 10 năm 2008: Tôi quên đề cập đến khi tôi viết bài này vào ngày hôm qua rằng posix_kill () sẽ trả về đúng nếu đã có một quy trình chạy với $ pid đang được chạy bởi cùng một người dùng tập lệnh của bạn đang chạy. Các số PID được tái chế khi đạt đến giới hạn, do đó có khả năng (mặc dù không thể) rằng bạn có thể kiểm tra một quy trình khác do bạn điều hành chứ không phải cùng một tập lệnh PHP chính xác. Nếu bạn chạy tập lệnh dưới dạng truy vấn gốc, bất kỳ PID nào đang chạy sẽ trả về true. I forgot to mention when I wrote this yesterday that posix_kill() will return true if there is already a process running with $pid which is being run by the same user your script is running as. Pid numbers do get recycled when the limit is reached, so it is potentially possible (although unlikely) that you might be checking another process that was run by you and not the same exact PHP script. If you run the script as root querying any pid that is actually running will return true.

Làm thế nào để kiểm tra xem một quá trình đang chạy PHP?

Trong PHP, điều này có thể được truy xuất bằng cách sử dụng getMypid () sẽ trả về số nguyên.Số PID này có thể được lưu vào một tệp và mỗi khi tập lệnh được chạy, một kiểm tra được thực hiện để xem liệu tệp có tồn tại không.Nếu đó là hàm posix_kill () có thể được sử dụng để xem liệu một quá trình có chạy với số PID đó không.posix_kill() function can be used to see if a process is running with that pid number.

Làm thế nào để kiểm tra xem chức năng PHP có hoạt động không?

Xác định xem chức năng PHP có khả dụng hay không, bạn có thể xác định xem chức năng PHP có được bật cho trang web của bạn hay không bằng cách sử dụng hàm function_exists ().by using the function_exists() function.