【问题标题】:Check if process is running with PHP检查进程是否使用 PHP 运行
【发布时间】:2015-04-24 07:25:40
【问题描述】:

我试图通过在 exec() 中使用 pgrep 来确定一个进程是否在 PHP 中运行。

checkstatus.php:

<?php
echo exec("pgrep myProgram");
?>

health.js:

$(document).ready(function() {
  $.post("checkstatus.php", {},
    function(data) {
      alert(data);
    }
  );
});

从命令行,这有效: php checkstatus.php

返回 PID

上面的代码应该可以工作,但返回的是 null。是否有我忽略的错误/更好的方法来做到这一点?

【问题讨论】:

  • 直接去checkstatus.php怎么样?
  • 如果我直接从浏览器点击 checkstatus.php 那么它仍然没有给我任何东西。除此之外,我想采用这种方法来保持代码干净且易于维护
  • 那么,这真的只是一个php问题吗?

标签: php jquery


【解决方案1】:

根据您对 Class 的响应,如果直接执行 checkstatus.php 将返回 null。 pgrep myProgram 在命令行中的输出是什么?

以下代码可在 Windows 7 上运行的 WAMP 上运行:

health.html

<!doctype html>
<head>
<title></title>
<script src="jquery-2.1.1.min.js"></script>
<style>
#output {
    background-color: #ddd;
    margin-top: 5px;
}
</style>
</head>
<body>
<button id="click">Click Me</button>
<div id="output"></div>
</body>
<script>
$("#click").click(function()
{
    console.log('clicked');
    $.post("health.php",
        function(data) {
          $('#output').html('From health.php: ' + data);
        }
    );
});
</script>
</html>

health.php

<?php

//system('ver');
echo exec('ver');

?>

【讨论】:

【解决方案2】:

这对我有用。

checkstatus.php:

<?php
echo exec("pgrep dropbox");

健康.php

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <title>Test</title>

    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">

    <!-- javascript/jQuery -->
    <script src="http://code.jquery.com/jquery-1.11.0.min.js"></script>

</head>
<body>
<script>
    $(document).ready(function () {
        $.post("checkstatus.php", {},
            function (data) {
                alert(data);
            }
        );
    });
</script>
</body>
</html>

截图:

【讨论】:

  • 请将dropbox改为myProgram
【解决方案3】:

试试这个(未经测试):

$(document).ready(function() {);
$.post( "checkstatus.php", function( data ) {
alert( "Data Loaded: " + data );
});
});

试试shell_execcheckstatus.php:

<?php
echo shell_exec("pgrep myProgram");
?>

并确保对 php 和文件进行以下设置。

    **safe mode off
    full read/write/exec permissions
    displaying all errors
    no disabled functions**

【讨论】:

  • 谢谢,您的代码已执行,但我没有收到任何返回数据的信息。由于它 checkstatus.php 在终端上运行良好,但在浏览器上运行良好,所以我觉得它与 php 有关。
【解决方案4】:

我认为您可能遇到的问题可能是 linux 权限,比 PHP 更多的是 linux 问题?

PHP 在您的单独用户帐户下运行。 (尝试 whoami 命令)在我的系统上,用户名是 apache 而不是我用于 PHP 和 apache 程序的普通用户帐户。试试这个:

<?php
    var_dump( shell_exec( 'whoami' ) );

我使用了 var_dump 而不是 echo,因此我们可以看到可能在需要时返回的任何非标量数据类型 (See here)。

现在...您最有可能遇到的问题是,从非 root 帐户运行进程列表时,它只会为您提供与您的帐户关联的进程列表。我在为工作创建系统监控应用程序时遇到了这个问题。如果你从 root 做一个进程列表,或者如果你使用 sudo,理论上你应该得到每个进程。

然而,解决方案是 sudo 您的网络服务器帐户 - 这将是一个主要的安全漏洞。解决方案是找到另一种方法来做你想做的事。对我来说,我能够创建一个由 cron 作业每分钟触发的 bash 脚本,该脚本将获取我需要的所有信息并将其以 JSON 格式保存到 Web 服务器可访问的文件中。

您到底想要达到什么目的?

编辑: 我注意到另一个答案是您在终端中从 PHP 调用脚本时得到结果。这是因为您将以与您的用户帐户相同的权限运行 PHP,这意味着 PHP 正在以您的用户帐户运行 pgrep 命令。您应该从 PHP 中看到与手动运行时完全相同的结果。

【讨论】:

  • 安全在这里不是问题。我正在为我用于工作的 VM 编写门户。保留一些我完成的沙箱代码和其他东西 我正在编写的门户的这一部分是查看我的服务器的一部分是否正在运行。如果不是,那么我可以打开/关闭它。 (这部分工作顺便说一句)另外,fwiw,sudo-ing,因为该用户不起作用。仍然可以从终端工作,但不能从 localhost/checkstatus.php
  • 在linux中,只有特定的用户,sudoers可以使用sudo命令。这可能是你不能 sudo 的原因。我不完全确定如何让您的网络服务器用户可以使用此命令,但即使安全不是问题,我也强烈建议您将网络服务器用户设置为系统管理员
【解决方案5】:

我最近发布了一个项目,它允许 PHP 获取并与真正的 Bash shell 交互(如果需要,作为用户:apache/www-data 或 root)。在这里获取:https://github.com/merlinthemagic/MTS

下载后您只需使用以下代码:

//Setting the second argument in getShell():
//true will return a shell with root
//false will return a shell with the php execution user
$shell    = \MTS\Factories::getDevices()->getLocalHost()->getShell('bash', true);
$return1  = $shell->exeCmd('pgrep myProgram');

$return1 包含一个带有 bash 返回的字符串。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-03-06
    • 2011-02-12
    • 2011-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多