web-dev-qa-db-ja.com

PHPからpsを呼び出さずに、指定されたPIDが現在実行されているかどうかを確認する方法は?

指定されたプロセスが現在PHPを介して実行されているかどうかを確認したいと思います。

単にPIDを提供し、それが現在実行中かどうかを確認したいと思います。

PHPは、この情報を提供する内部関数を持っていますか、または「ps」出力から解析する必要がありますか?

33
anonymous-one

Linuxを使用している場合は、これを試してください:

if (file_exists( "/proc/$pid" )){
    //process with a pid = $pid is running
}
69
Nasreddine

posix_getpgid($pid);は、プロセスが実行されていないときにfalseを返します

37

そのための機能が必要な場合:

$running = posix_kill($pid,0);

プロセス識別子pidを使用して、シグナルsigをプロセスに送信します。

呼び出し posix_kill 0のkillシグナルは、プロセスが実行されている場合はtrueを返し、そうでない場合はfalseを返します。

15
Steel Brain

Shell_execを使用してbashスクリプトを呼び出します

$pid = 23818;
if (Shell_exec("ps aux | grep " . $pid . " | wc -l") > 0)
{
    // do something
}
3
Pierre-Olivier

posix_kill(posix_getpgrp(), 0)は、PIDが実行されているかどうかを確認する最良の方法だと思います。Windowsプラットフォームでは利用できません。

シェルの_kill -0 PID_、およびPHPのShell_exec('kill -0 PID')と同じですが、pidが存在しない場合はエラーは出力されません。

分岐した子プロセスでは、_posix_getpgid_は、親が終了した場合でも常に親のpidを返します。

_<?php

$pid = pcntl_fork();

if ($pid === -1) {
    exit(-1);
} elseif ($pid === 0) {
    echo "in child\n";
    while (true) {
        $pid = posix_getpid();
        $pgid = posix_getpgid($pid);
        echo "pid: $pid\tpgid: $pgid\n";
        sleep(5);
    }
} else {
    $pid = posix_getpid();
    echo "parent process pid: $pid\n";
    exit("parent process exit.\n");
}
_
1
consatan

私はこのためのスクリプトを作成しました。これはin wordpressを使用してゲームサーバーのステータスを表示しますが、これはサーバーで実行中のすべてのプロセスで動作します

<?php
//##########################################
// desc: Diese PHP Script zeig euch ob ein Prozess läuft oder nicht
// autor: seevenup
// version: 0.2
//##########################################

if (!function_exists('server_status')) {
        function server_status($string,$name) {
                $pid=exec("pidof $name");
                exec("ps -p $pid", $output);

                if (count($output) > 1) {
                        echo "$string: <font color='green'><b>RUNNING</b></font><br>";
                }
                else {
                        echo "$string: <font color='red'><b>DOWN</b></font><br>";
                }
        }
}

//Beispiel "Text zum anzeigen", "Prozess Name auf dem Server"
server_status("Running With Rifles","rwr_server");
server_status("Starbound","starbound_server");
server_status("Minecraft","minecarf");
?>

詳細はこちら http://umbru.ch/?p=328

0
Sven Lauber

以下がその方法です。

if (`ps -p {$pid} -o comm,args=ARGS | grep php`) {

  //process with pid=$pid is running;
}
0
Denis Matafonov
$pid = 12345;
if (Shell_exec("ps ax | grep " . $pid . " | grep -v grep | wc -l") > 0)
{
    // do something
}
0
Leonid Zakharov
//For Linux
$pid='475678';
exec('ps -C php -o pid', $a);
if(in_array($pid, $a)){
    // do something...
}
0