За последние 24 часа нас посетили 16895 программистов и 1704 робота. Сейчас ищут 930 программистов ...

И ещё раз про exec(), system() и т.п. (Linux)

Тема в разделе "PHP для новичков", создана пользователем YBosco, 27 мар 2009.

  1. YBosco

    YBosco Активный пользователь

    С нами с:
    4 мар 2008
    Сообщения:
    11
    Симпатии:
    0
    Тут во многих местах форума обсуждается один и тот же вопрос, почему утилиты exec() и system() не позволяют выполнять собственноручно написанные команды (скритпы) из /usr/bin. Ответа никто не получил, мне кажется, потому что неправильно формулируют вопрос.

    Пишу простенький скрипт "Test":
    #! /bin/sh
    #
    date > date.log
    exit 0


    И простенький php:
    <?php
    system('Test');
    ?>


    Всё отлично запускается. В файле date.log можно прочитать время запуска скрипта.
    Теперь, предположим, я хочу запустить dvbstream на сервере. Добавляю параметры, и скрипт в результате выглядит так:
    #! /bin/sh
    #
    #
    date > date.log
    dvbstream -f 12717 -p v -s 23500 8192 -c 0 -I 2 -udp > dvbstream.log
    exit 0


    После запуска смотрим date.log, есть отметка о запуске, файл dvbstream.log пуст, и ... больше ничего, ни ошибок, ни запущенной dvbstream. Нечего и говорить, что из строки скрипт прекрасно работает.

    Что неправильно?

    При замене exec на passthru вывод результата операции даёт "0" (код завершения).
     
  2. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
  3. YBosco

    YBosco Активный пользователь

    С нами с:
    4 мар 2008
    Сообщения:
    11
    Симпатии:
    0
    Если я запускаю dvbstream только, то тоже не идёт. Не в кол-ве строк дело. Тут какие-то системные проблемы. Как-то блокируются действия.
    Я тут пытался разобраться, как сделано в Webmin, но там на Perl.
     
  4. admyx

    admyx Активный пользователь

    С нами с:
    14 мар 2008
    Сообщения:
    2.159
    Симпатии:
    1
    $q = file_get_contents('test');
    $r = exec($q);

    ??
     
  5. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    #! /bin/sh
    #
    date > date.log
    exit 0

    И простенький php:
    <?php
    system('Test');
    ?>


    `/path/to/Test`;
    и права на выполнение поставь


    все должно работать
     
  6. YBosco

    YBosco Активный пользователь

    С нами с:
    4 мар 2008
    Сообщения:
    11
    Симпатии:
    0
    Я немного изменил предложенное содержимое:

    $q = file_get_contents('test');
    echo $q;
    $r = exec($q);

    Вот, что выводится в окне браузера:
    #! /bin/sh # # date > list.log dvbstream -f 12717 -p v -s 23500 8192 -c 0 -I 2 -udp exit 0

    Ну и никакой разницы.

    А вот так это выглядит в Webmin (для наглядности date идёт непосредственно на stdout):
    > Test
    Fri Mar 27 15:15:27 MSK 2009
    dvbstream v0.6 - (C) Dave Chapman 2001-2004
    Released under the GPL.
    Latest version available from http://www.linuxstb.org/
    Tuning to 12717 Hz
    Using DVB card "Conexant CX24116/CX24118", freq=12717
    tuning DVB-S to Freq: 2117000, Pol:V Srate=23500000, 22kHz tone=off, LNB: 0
    Setting only tone ON and voltage 13V
    DISEQC SETTING SUCCEDED
    Getting frontend status
    Bit error rate: 0
    Signal strength: 51776
    SNR: 33587
    UNC: 0
    FE_STATUS: FE_HAS_SIGNAL FE_HAS_LOCK FE_HAS_CARRIER FE_HAS_VITERBI FE_HAS_SYNC
    dvbstream will stop after -1 seconds (71582788 minutes)
    Using 224.0.1.2:5004:2
    version=2
    Streaming 1 stream
    Caught signal 15 - closing cleanly.

    "signal 15" - это я остановил процесс.
     
  7. YBosco

    YBosco Активный пользователь

    С нами с:
    4 мар 2008
    Сообщения:
    11
    Симпатии:
    0
    Да всё это я уже проходил.
    dvbstream доступна для запуска всем, а путь можно указывать, а можно и нет, всё стоит в /usr/bin.

    Раз строка date идёт, то значит обращение к скрипту идёт. :)
     
  8. Frozen

    Frozen Активный пользователь

    С нами с:
    20 окт 2008
    Сообщения:
    540
    Симпатии:
    0
    Адрес:
    Москва
    при ошибки запуска dvbstream возможно пришет в stderr, поэтому ничего в логе нету
    есть права на запуск dvbstream?
     
  9. YBosco

    YBosco Активный пользователь

    С нами с:
    4 мар 2008
    Сообщения:
    11
    Симпатии:
    0
    www-data ALL=(ALL) ALL

    Так сделал на время отладки.
     
  10. YBosco

    YBosco Активный пользователь

    С нами с:
    4 мар 2008
    Сообщения:
    11
    Симпатии:
    0
    В общем, кому интересно, я решил эту проблему. Возможно, способ покажется кому-нибудь несколько прямолинейным и наивным, но он работает.

    Суть в том, что на сервере запускается циклический скрипт, который контролирует набор флагов, которые меняются с помощью php-скриптов. Поскольку циклический скрипт запускается из-под root, то он может всё, и права корёжить не требуется.
    Я скоро выложу это в Инете. Ссылку приведу.