2015-02-23 5 views
0

Я пытаюсь выяснить, работает ли процесс на PHP с помощью pgrep внутри exec().Проверьте, работает ли процесс с PHP

checkstatus.php:

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

health.js:

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

из командной строки, это работает: PHP checkstatus.php

Какой retrns ПИД

Вышеприведенный код должен работать, но возвращает значение null. Есть ли ошибка, которую я пропускаю/лучший способ сделать это?

+0

А как насчет просто 'checkstatus.php' напрямую? – Class

+0

Если я нажму checkstatus.php прямо из браузера, то он все равно ничего не дает. Кроме того, я хотел бы использовать этот подход, чтобы поддерживать код в чистоте и легко поддерживать – user3780616

+0

Итак, это действительно просто проблема php? –

ответ

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** 
+0

Спасибо, ваш код выполняется, но я не получаю ничего, что возвращалось к данным. Поскольку checkstatus.php отлично работает с терминалом, но не из браузера, я чувствую, что это что-то с php. – user3780616

0

От вашего ответа на класс checkstatus.php возвращает null, если выполняется непосредственно. Что такое вывод pGrep myProgram внутри командной строки?

Следующий код функционирует на WAMP работает на Windows 7:

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'); 

?> 
+0

$ pgrep MyProgram возвращает правильный PID $ PHP checkstatus.php возвращает тот же PID свыше HTTP: //localhost/checkstatus.php возвращает нулевое значение – user3780616

+0

Это говорит о том, что это может быть конфигурация сервера вопрос. Вот несколько полезных вопросов: http://stackoverflow.com/questions/538939/php-exec-will-not-execute-shell-command-when-executed-via-browser http://stackoverflow.com/ Вопросы/28069744/php-exec-works-in-command-line-but-not-when-execute-via-browser http://stackoverflow.com/questions/13015513/php-shell-exec-not-working -in-html-browser-but-working-on-cmd-prompt – mulquin

+0

Фактически, я пробовал этот же код с другим процессом и, похоже, работал. Может быть, мне нужно добавить ожидание в php или что-то в этом роде? – user3780616

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> 

Скриншот: enter image description here

+0

Пожалуйста, измените 'dropbox' на' myProgram' –

0

Я думаю, что проблема у Вас может быть, может быть с Линукс разрешений, более проблема linux, чем PHP?

PHP работает под отдельной учетной записью пользователя. (попробуйте команду whoami). В моей системе имя пользователя apache вместо обычной учетной записи пользователя для программ PHP и Apache. Попробуйте это:

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

Я использовал var_dump вместо эха, чтобы мы могли видеть, какие нескалярных тип данных, которые могут быть возвращены в случае необходимости (See here).

Теперь ... Скорее всего, ваша проблема заключается в том, что при запуске списка процессов из учетной записи, отличной от root, он предоставит вам список процессов, связанных с вашей учетной записью. Я столкнулся с этой проблемой, когда создавал приложение для мониторинга системы для работы. Если вы выполняете список процессов из корня или используете sudo, теоретически вы должны получить каждый процесс.

Решение, однако, является NOT для sudo вашей учетной записи веб-сервера - это было бы серьезным недостатком безопасности. Решение состоит в том, чтобы найти другой способ сделать то, что вы хотите сделать. Для меня я смог создать скрипт bash, который запускался каждую минуту с помощью задания cron, которое захватывало всю необходимую информацию и сохраняло бы ее в формате JSON в файл, доступный веб-серверу.

Что именно вы пытаетесь достичь?

EDIT: Я заметил в ответ на другой ответ, что вы получаете результаты при вызове скрипта из PHP в терминале. Это связано с тем, что вы будете запускать PHP с теми же правами, что и ваша учетная запись, то есть PHP выполняет команду pgrep в качестве учетной записи пользователя. Вы должны увидеть точно такие же результаты с PHP, что и при его ручном запуске.

+0

Безопасность здесь не проблема. Я пишу портал для виртуальной машины, которую я использую для работы. сохранить часть моего готового кода песочницы и другие вещи. Эта часть моего портала, которую я пишу, - это посмотреть, работает ли часть моего сервера. Если это не так, я могу включить/выключить его. (Эта часть работает btw) Кроме того, fwiw, sudo-ing, поскольку этот пользователь не работает. Все еще работает с терминалом, но не с localhost/checkstatus.php – user3780616

+0

В linux только определенные пользователи, sudoers могут использовать команду sudo. Возможно, поэтому вы не можете судо. Я не совсем уверен, как вы могли бы сделать эту команду доступной для пользователя вашего веб-сервера, но даже когда безопасность не является проблемой, я очень не рекомендую делать пользователям веб-сервера sysadmin – Shane

0

Недавно я опубликовал проект, который позволяет PHP получать и взаимодействовать с реальной оболочкой Bash (в качестве пользователя: 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 содержит строку с возвращением из Баша.

Смежные вопросы