C: использование system в CGI

Модератор: Модераторы разделов

IMB
Сообщения: 2567
ОС: Debian

C: использование system в CGI

Сообщение IMB »

Доброго дня!
cgi

Код: Выделить всё

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define HTTP_STATUS_405(a, n)  do {\
            if (strcmp(getenv("REQUEST_METHOD"), a)) {\
                printf("Status: 405 Method Not Allowed\n"\
                       "Content-Type: text/xml; charset=\"utf-8\"\n"\
                       "Allow: %s\n\n"\
                       "<reason>Method %s is't allowed!</reason>", a, n);\
                return -1;\
            }\
        } while (0)
#define HTTP_STATUS_400(f, a...) do {\
           printf("Status: 400 Bad Request\n"\
                  "Content-Type: text/xml; charset=\"utf-8\"\n\n"\
                  "<reason>" f "</reason>", ##a);\
            return -1;\
        } while (0)
#define HEADER          "Content-Type: text/plain\n\n"
#define OK(f, a...) printf("%s{\"result\":\"OK\",\"answer\":\"" f "\"}",\
                           HEADER, ##a)

int main(int argc, char *argv[])
{
    HTTP_STATUS_405("GET", "POST");

    system("/usr/bin/killall -2 av_server.out");
    system("/usr/bin/killall -2 wis_streamer");
    system("/usr/bin/killall -9 system_server");

    if (system("cd /opt/ipnc && ./system_server&") != 0)
        HTTP_STATUS_400("Can't run system_server");

    OK("System_server running");

    return 0;
}

Скрипт запускается с web-страницы посредством JavaScript, должен перезапустить ряд сервисов и вернуть в JavaScript сообщение.
Скрипт отрабатывает, сервисы перезапускаются, но обратно результат не возвращается. На основании чего я решил, что скрипт отрабатывает - вывод в консоль, просматриваю через minicom, и после ручного обновления страницы я вижу изменённые данные.
При запуске через броузер скрипт отрабатывает, но никого выходного текста я не наблюдаю, вкладка находится в ожидании. Создаётся ощущение, что скрипт завис.
Вопрос - как добиться, что бы скрипт возвращал результат?
Спасибо.
Спасибо сказали:
Аватара пользователя
/dev/random
Администратор
Сообщения: 5427
ОС: Gentoo

Re: C: использование system в CGI

Сообщение /dev/random »

А при ручном запуске в консоли, без веб-серверов и браузеров? Если тоже зависнет, то запустите под отладчиком и посмотрите, где именно он зависнет.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C: использование system в CGI

Сообщение IMB »

Ручной запуск проходит без проблем, правда пришлось отключить проверку на REQUEST_METHOD. давала Segmentation fault.

Добавил в скрипт вывод отладочной информации в файл:
cgi

Код: Выделить всё

int main(int argc, char *argv[])
{
    FILE *fd;

    HTTP_STATUS_405("GET", "POST");
    fd = fopen("/tmp/reload", "w");
    fprintf(fd, "Request GET\n");
    system("/usr/bin/killall -2 av_server.out");
    system("/usr/bin/killall -2 wis_streamer");
    system("/usr/bin/killall -9 system_server");
    fprintf(fd, "All kill\n");
    if (system("cd /opt/ipnc && ./system_server&") != 0)
        HTTP_STATUS_400("Can't run system_server");
    fprintf(fd, "After restart\n");
    //sleep(10);
    OK("System_server running");
    fprintf(fd, "After send message\n");

    return 0;
}

Содержимое файла /tmp/reload

Код: Выделить всё

Request GET
All kill
After restart
After send message

Судя по выводу мне в броузер ушло сообщение о удачном перезапуске, но страница всё равно почему-то находится в ожидании ответа.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C: использование system в CGI

Сообщение IMB »

Запустил whireshark - через 8 секунд после обращения к скрипту сервер возвращает ответ со статусом 200 и сообщением Connection: close.
При этом в пакете я вижу ответ от своего скрипта и вывод программ при перезагрузке, но страница всё равно в ожидании.
Спасибо сказали:
IMB
Сообщения: 2567
ОС: Debian

Re: C: использование system в CGI

Сообщение IMB »

Пока сделал костыль - в JavaScript выставил перезагрузку страницы через 10 секунд.
Спасибо сказали: