Решение проблемы включило бы понимание, почему это происходит. Необходимо запустить путем просмотра журналов, чтобы видеть, существуют ли какие-либо очевидные ошибки; начать /var/log/Xorg.0.log
и lightdm
журнал в /var/log/lightdm/lightdmlog
.
Чтобы избежать необходимости делать трудное завершение работы, в следующий раз, это происходит, переключатель к консоли с CtrlAltF1 (или любой из ключей F_ между 1 и 6) и вход в систему, и перезапустите менеджера по оформлению с:
sudo service lightdm restart
Можно затем переключить назад на консоль это X
(Ваш GUI), работает в с CtrlAltF7, где можно войти в рабочий стол Монетного двора.
Ну, для запуска не делает PHP shell_exec
через bash
в Вашем случае это делает его через sh
. Это довольно очевидно из точного сообщения об ошибке. Я предполагаю, что этим управляет любая оболочка, указан в/etc/passwd для пользователя, которого веб-сервер выполняет как, и shell_exec не получает stderr, в сочетании с тем, что при выполнении PHP из командной строки, это просто выбывает к $ {SHELL}. При запуске как sh удар выключает много функций для лучше имитации поведения исходной оболочки sh. Определение источника .bashrc
и .bash_profile
почти наверняка среди тех, если ни по какой другой причине затем, потому что те файлы, вероятно, будут использовать определенный для удара синтаксис или расширения.
Я не действительно уверен в случае SSH, но судящий по плоскости $
подсказка, Вы могли бы очень хорошо пробегать sh туда, который аналогично объяснит поведение, которое Вы видите. Попробовать echo ${SHELL}
видеть то, что в Вас действительно заскочили; это должно работать над всеми оболочками.
Тем не менее это кажется мне как действительно плохая идея зависеть от псевдонимов удара из Сценария PHP. Если то, что Вы хотите сделать, слишком длинно для установки приятно к shell_exec
сам оператор (который должен только использоваться с большой осторожностью), делая функцию PHP для создания командной строки из параметров и называя, который является почти наверняка намного лучшим подходом, и он будет работать по существу, независимо от которого оболочка установлена, выбрана или как он настроен. С другой стороны, рассмотрите вызов внешнего файла сценария, который может быть записан в ударе и указать/bin/bash как его интерпретатор. Но затем Ваше приложение потребует, чтобы удар был установлен (который это, вероятно, уже делает, если это зависит от псевдонимов удара...).
$
и отключенная другая несоответствующая информация. Проблема, с которой я имею дело, - то, что название исполняемого файла Python изменяется, в то время как системный администратор решает, какая версия Python должны быть установлены на сервере, таким образом, мне, возможно, придется изменитьсяpython
кому:python3
кому:python3.0
или назад снова, или даже переносят вызовы кpython2
сpython
для более старых сценариев. Я предполагаю, что они могли бы быть лучше из того, как обертка управляет в$HOME/bin
затем, или это - также плохая практика? – dotancohen 24.01.2013, 13:03define(PYTHON_INTERPRETER, 'python3.0'); ... shell_exec(PYTHON_INTERPRETER . ' somefile.py');
казалось бы, был бы одной возможной альтернативой.define
может быть помещен в некоторый конфигурационный файл, который являетсяrequire
d каждым .php файлом, который должен назвать внешний сценарий Python. (тьфу) Или просто попросите, чтобы системный администратор поместил символьную ссылку в некоторое стабильное местоположение и указал, что это к любой версии Python, оказывается, установлено сегодня. (/usr/local/bin/python
указывая/usr/bin/python
сегодня,/usr/bin/pyhon3.0
завтра, и/usr/bin/python2
на следующий день после этого.) – a CVn 24.01.2013, 16:59