Менеджер процессов - PullRequest
       0

Менеджер процессов

2 голосов
/ 22 августа 2011

Я пытаюсь написать оболочку для симулятора, которая предоставляет веб-API, чтобы пользователи могли создавать симуляции на сервере и собирать результаты.

Вначале я планировал запуск php-симуляции StartSimulation.php в Apache, которая будет запускать и выполнять симуляцию и передавать результаты в файл. Однако вы не можете разветвлять и выполнять в php внутри модуля apache. Кроме того, в этой реализации он становится немного запутанным, потому что нет процессов, управляющих осиротевшими симуляциями, поэтому сложно их убить и сосчитать. Кажется, немного сложно использовать стандартный веб-сервер, поскольку нет глобального состояния, в котором хранится список запущенных процессов (симуляций).

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

По сути, оболочка должна иметь доступный через Интернет API с 3 командами.

1.) Start_simulation - который в основном разветвляет и запускает экземпляр симулятора, записывает его pid в таблицу и передает его стандартный вывод в известный буфер. Оболочка не должна позволять запускать более 16 экземпляров симулятора на сервере. В случае успеха он возвращает код симуляции пользователю. В противном случае возвращается код ошибки.

2.) Остановить симуляцию - берет код симуляции, возвращенный в (1), и убивает связанный процесс.

3.) Get_process - принимает код моделирования, возвращенный в (1), ищет известный буфер, который содержит стандартный вывод для этого процесса, и возвращает эту информацию пользователю.

Должен ли я написать собственный сервер приложений для этого? Если так, есть ли хороший пакет с каким-нибудь стартовым кодом?

Спасибо Kyle

1 Ответ

1 голос
/ 26 апреля 2012

Я знаю, что это старый вопрос, но, надеюсь, он все-таки окажется полезным для кого-то ...

Наличие управления процессами (fork / exec / wait / kill / signal и т. Д.) В PHP-скрипте под названиемнапрямую из Apache через http-запрос определенно не подходит.Как вы говорите, это очень быстро запутывается:)

Я бы предположил, что PHP-скрипт, вызываемый через http, является просто командным прокси для простого серверного процесса.Если PHP является вашим предпочтительным языком, вы можете реализовать оба этих способа.

Например, вы можете сделать это с очередями сообщений следующим образом ...

  1. Вы можете создатьдовольно простой сервер PHP, который создает очередь сообщений и ожидает поступления сообщений. Затем он может выполнять работу по запуску или остановке процессов симулятора

  2. Удаленный пользователь выбирает операцию (запуск, остановка, получение вывода) через форму веб-страницы.

  3. Это приводит к тому, что запрос HTTP / POST отправляет данные формы в ваш PHP-скрипт (я бы сделал это как AJAX-вызовпоэтому я могу отправлять данные и интерпретировать результат без перезагрузки страницы)

  4. Ваш серверный PHP-скрипт может интерпретировать данные формы и отправлять команду через сообщение процессу PHP-сервера.

Давайте проиллюстрируем это с помощью некоторого кода PHP.Я держу это тривиальным и неискушенным в интересах краткости.

PHP Script (цель веб-формы)

Здесь мы интерпретируем наш входящий запрос формы и переворачиваемэто в сообщение для серверного процесса

<?php
/*
 * Responses are sent as simple text strings to be interpreted by
 * the client-side JavaScript handling this AJAX call. Responses
 * starting with 'ERR:' are errors, responses starting with 'ACK:'
 * are acknowledgements. Simply check the first few characters of
 * the response in the client-side JavaScript.
 */
header('Content-Type: text/plain; charset=UTF-8);

/*
 * Here we define some message types, one per command. These should correspond
 * to the command string sent from the web form
 */
$command = array(
    'START_SIM'  => 1,
    'STOP_SIM'   => 2,
    'GET_STATUS' => 3,
    'GET_OUTOUT' => 4
);

$queue_id = 0xbeef;             /* An arbitrary message queue id */
$cmd = $_REQUEST['command'];    /* The command from the web form */

/* get simulator instance id to act upon, if specified */
if (isset($_REQUEST['id']))
    $sim_id = $_REQUEST['id'];
else
    $sim_id = '';               /* no sim id? probably a create command */

/* check the message queue exists... */
if (msg_queue_exists($queue_id) === false) {
    echo 'ERR:Message queue not found!';
    return;
}

/* open the message queue and pass the command on to the server... */
if (($qhandle = msg_get_queue($queue_id)) === false) {
    echo 'ERR:Failed to open message queue to server';
    return;
}

if (msg_send($qhandle, $command[$cmd], $sim_id) === false)
    echo 'ERR:Failed to send command';
else
    echo 'ACK:Command sent ok';
?>

PHP Server (запускается отдельно на вашем веб-сервере)

А вот такой же простой сервер ...

<?php
/*
 * assume the same queue id's and defines as in the
 * client code above, etc..
 */

if (($qhandle = msg_get_queue($queue_id)) === false) {
    /* emit failure message to log file etc.. */
    ...
    return;
}

while (1) {
    if (msg_receive($qhandle, 0, $msgtype, $message,
        true, 0, $rc) === false) {
            /* log error message ... */
    } else {
        /*
         * Get the client id (in case you want to send
         * a reply back to the client) and the
         * message data, which is the simulation id.
         *
         * Remember that we use the message type to
         * indicate the command being requested
         */
        $client = $message['client'];
        $sim_id = $message['msg'];
        evaluate_command($client, $msgtype, $sim_id);
    }
}
?>

Очевидно, что это ужасно просто, без проверки ошибок, и вам нужно будет написать функцию "valu_command () "самостоятельно.Я просто набросал это, чтобы проиллюстрировать идею (и я записал это с рук, так что оно может быть переполнено другими ошибками!)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...