我试图通过在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。是否存在我忽略的错误/更好的方法?
答案 0 :(得分:0)
试试这个(未经测试):
$(document).ready(function() {);
$.post( "checkstatus.php", function( data ) {
alert( "Data Loaded: " + data );
});
});
并尝试shell_exec
checkstatus.php:
<?php
echo shell_exec("pgrep myProgram");
?>
并确保对php和文件进行以下设置。
**safe mode off
full read/write/exec permissions
displaying all errors
no disabled functions**
答案 1 :(得分:0)
从您对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 :(得分:0)
这项工作适合我。
checkstatus.php:
<?php
echo exec("pgrep dropbox");
health.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>
截图:
答案 3 :(得分:0)
我认为您可能遇到的问题可能是 linux权限,更多的是Linux问题而不是PHP?
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完全相同的结果。
答案 4 :(得分:0)
我最近发布了一个项目,允许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的字符串。