Возможно, вы могли бы помочь мне с довольно неприятной проблемой. Я не смог скомпилировать исполняемый файл, позвонил ему $$execprob
, на хост Linux, который я тестировал, поэтому скомпилировал его на другом хосте и переместил исполняемый файл. Он отлично работает с моим SSH-пользователем, но когда веб-сервер использует
exec( "/home/$$username/usr/local/bin/$$execprob", $output, $return );
Я не получаю $output
а $return
- 127, или файл не найден.
Вот список информации из моего тестирования, который может помочь:
-rwxr-xr-x
.exec( 'ls -l' )
поскольку веб-сервер показывает, что файл существует с теми же правами, что и SSH${USER}
является владельцем файла $$ username${USER}
ничего не возвращаетexec( 'if [-x/home/$$username/usr/local/bin/$$execprob]; then echo "thing";fi' )
печатает "вещь";php -a
и php -a
exec( "/home/$username/usr/local/bin/$$execprob", $output, $return );
запускает $$ execprob правильно, с $output
показывающим вывод, и $return
== 0.$LD_LIBRARY_PATH
: export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;
Это необходимо для запуска исполняемого файла, поскольку он использует динамическую библиотеку. Мой.bashrc не запускается веб-сервером; однако, работает: exec( "export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;/home/$$username/usr/local/bin/$$execprob", $output, $return );
по-прежнему имеет тот же неудачный результат.
Если что-то еще я могу сделать, чтобы собрать дополнительную информацию об устранении неполадок, пожалуйста, дайте мне знать.
Благодарю!
Проблема была, наконец, прослежена до того, что переменная среды $ LD_LIBRARY_PATH не была правильно настроена. У меня была эта строка:
exec( "export LD_LIBRARY_PATH=$HOME/usr/local/lib:$LD_LIBRARY_PATH;
/home/$$username/usr/local/bin/$$execprob", $output, $return );
Однако, конечно, (как уже упоминалось в @JoelC выше) переменная $HOME
в команде export
будет разрешать $HOME
пользователя PHP. Это было исправлено с использованием абсолютного пути как такового:
exec( "export LD_LIBRARY_PATH=/home/$$username/usr/local/lib:$LD_LIBRARY_PATH;
/home/$$username/usr/local/bin/$$execprob", $output, $return );
Стоит отметить, что не было абсолютно никакого результата, возвращенного, чтобы помочь диагностировать это, что странно. Когда я запускаю $$execprob
из оболочки без набора $LD_LIBRARY_PATH
он возвращает ошибку об отсутствующем файле.so. Почему бы эту же ошибку не вернуть в качестве вывода здесь? Может быть, есть другая категория вывода для системных сообщений, а не фактический вывод команды? Интересно, есть ли способ вернуть эти типы сообщений в область exec()
.
Но я полагаю, что вопрос для другого поста...
print "/home/$$username/usr/local/bin/$$execprob"
чтобы убедиться, что он правильно разрешает любые имена переменных и т. Д./home/jonnybajonny/usr/local/bin/execfilename
и это не работает.