Не удается запустить скрипт bash в PHP

Я пытаюсь запустить скрипт bash в PHP, но не могу его запустить. php -v

PHP 5.3.10-1ubuntu3.2 with Suhosin-Patch (cli) (built: Jun 13 2012 17:19:58)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2012 Zend Technologies

Убунту 12.04 ЛТС 64 бит.

Мой php-код:

    $cmd='/www/var/pl/bash.sh';
    $retval =-1;
    exec( $cmd, $output ); //executing the exec function.
    foreach( $output as $tmp ) 
    { 
        echo "$tmp <br>"; 
    };

Баш.ш:

 #!/bin/bash
swipl --quiet -s /var/www/pl/ples.pl -g "f(R, gel), writeln(R),open('/var/www/pl/in.txt',write, Stream),
write(Stream, (R)),
nl(Stream),
close(Stream)" -t halt.

Что я делаю не так?

И я могу запустить bash.sh в терминале Linux.


person RockOnGom    schedule 22.09.2012    source источник
comment
Попробуйте поставить перед сценарием оболочки bash - так что bash /www/var/pl/bash.sh   -  person Robbie    schedule 22.09.2012
comment
Измените $cmd на /www/var/pl/bash.sh 2>&1. Он по-прежнему не запускается, но может дать вам некоторое представление о том, почему он не запускается.   -  person LSerni    schedule 22.09.2012
comment
Какие ошибки вы видите, если они есть? Я предполагаю, что ваш PHP не работает в безопасном режиме и что команда exec специально не отключена?   -  person Basic    schedule 22.09.2012


Ответы (2)


Когда вы запускаете скрипт в терминале, вы выполняете его под учетной записью, в которую вы вошли. У вас есть настройка оболочки с путем поиска и т.д.

Когда php выполняет скрипт, он не имеет настройки оболочки и запускается под учетной записью пользователя веб-сервера. При выполнении:

  • убедитесь, что у вас есть полные пути к вашему файлу, swipl недостаточно, должно быть /path/to/swipl
  • убедитесь, что у процесса веб-сервера достаточно прав доступа, чтобы получить все необходимое.
person JvdBerg    schedule 22.09.2012

Скорее всего, это проблема пути или разрешения; например, пользователь, от имени которого запускается веб-приложение, понятия не имеет, где находится программа swipl.

Добавьте 2>&1 в командную строку перед exec, чтобы она сообщила вам, в чем проблема. Или вы можете найти вывод stderr в журнале ошибок веб-сервера (или в журнале ошибок PHP; проверьте его путь и настройки в php.ini).

person LSerni    schedule 22.09.2012