Тут во многих местах форума обсуждается один и тот же вопрос, почему утилиты 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" (код завершения).
http://www.php.ru/manual/function.exec.html string exec ( string command [, array &output [, int &return_var]] ) Не поддерживает команды в несколько строк... ?
Если я запускаю dvbstream только, то тоже не идёт. Не в кол-ве строк дело. Тут какие-то системные проблемы. Как-то блокируются действия. Я тут пытался разобраться, как сделано в Webmin, но там на Perl.
#! /bin/sh # date > date.log exit 0 И простенький php: <?php system('Test'); ?> `/path/to/Test`; и права на выполнение поставь все должно работать
Я немного изменил предложенное содержимое: $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" - это я остановил процесс.
Да всё это я уже проходил. dvbstream доступна для запуска всем, а путь можно указывать, а можно и нет, всё стоит в /usr/bin. Раз строка date идёт, то значит обращение к скрипту идёт.
при ошибки запуска dvbstream возможно пришет в stderr, поэтому ничего в логе нету есть права на запуск dvbstream?
В общем, кому интересно, я решил эту проблему. Возможно, способ покажется кому-нибудь несколько прямолинейным и наивным, но он работает. Суть в том, что на сервере запускается циклический скрипт, который контролирует набор флагов, которые меняются с помощью php-скриптов. Поскольку циклический скрипт запускается из-под root, то он может всё, и права корёжить не требуется. Я скоро выложу это в Инете. Ссылку приведу.