2013-12-13 4 views
1

У меня есть сценарий оболочки с именем brew.sh следующим образом:Запуск сценария оболочки с веб-сервера

#!/bin/bash 

brew doctor > test.txt 

, который работает хорошо, когда я запустить его из командной строки. Он выводит, как ожидалось, результат работы врача-пивовара в файл test.txt. Однако, когда я вызываю его с веб-страницы php, как показано ниже, он создает файл test.txt, но файл пуст.

<?php 

$output = shell_exec("./brew.sh"); 
echo $output; 

?> 

Я подозревал, что это была проблема с разрешениями/собственность, поэтому я использовал CHOWN сменить владельца от username:staff к _www:_www на родительский каталог, где он будет затем создать файл test.txt, но не записывать выход на него. Я даже пытался изменить разрешения на 777 временно на test.txt, и даже это не сработало. В конечном счете, я хотел бы посмотреть результаты работы врача-пивоваренного врача и опубликовать обновление на веб-странице моей локальной машины разработки. Неужели это не должно быть так сложно?

+0

делает '$ PATH' для пользователя' _www', содержит путь к 'brew', и пользователь получил разрешения, необходимые для запуска bin? –

+0

Я добавил пиво к пути apache, следуя информации здесь [переменная среды для apache] (http://stackoverflow.com/questions/6833939/path-environment-variable-for-apache2-on-mac) По-прежнему нет радости , – Hoppo

ответ

3

Элиас будет прав, я подозреваю, - среды на строке cmd не будет похож на среду, в которой сценарий окажется внутри веб-сервера, если пользователю веб-сервера даже разрешено запускать надлежащую оболочку ...

Вам понадобится путь. Проверьте, каково значение вашего пути, и введите его.

Также не мешает всегда включать полный путь для вашего двоичного файла, то есть варить.

#!/bin/bash 
PATH="/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:/usr/local/bin" 
/usr/local/bin/brew doctor > /var/www/whatever/test.txt 

.... лично .. Это не тот подход, который я бы использовал. Если это для варочного врача и обновления для пива, я бы просто использовал задания cron, которые перенаправляют вывод в файл на веб-сервере, так как я не хочу, чтобы веб-сервер вызывал команды пивоварения ... кто-то мог бы сделать сервер довольно легко, просто запросив эти страницы много. Решение cron довольно пуленепротивление, хотя - и в любом случае с cron я могу запустить его как более подходящего пользователя, где разрешения/среда для варева, скорее всего, будут работать более корректно в любом случае.

Кроме того, другие ребята указывают на то, что проверка ошибок является хорошей. stderr, вероятно, заканчивается в ваших веб-журналах в тот момент, когда вы получаете пустой вывод. 2> & 1, возможно, это может пойти в этот файл.

[Обратите внимание, что это должно быть 2> & 1 !! Я думаю, что у Криса была опечатка, когда он писал> 2 & 1, который делает что-то совсем другое. 2 - это дескриптор файла stderr, который мы хотим перенаправить на 1.> 2, перенаправит 1 (stdout) в файл с именем 2.

+0

Хорошая точка на веб-сервере, которому не разрешено запускать надлежащую оболочку: она не может, например, '.profile' не загружается. OP будет использовать трубы, я думаю, [как я сделал, после публикации моего первого вопроса о SO] (http://stackoverflow.com/questions/9843550/load-profile-with-proc-open) –

+0

wow , спасибо, это не тот подход, который я видел раньше. TIL. – pacifist

+0

Спасибо, пацифист, это объясняет, почему это было так сложно! Похоже, мне есть чему поучиться. Теперь я создал задание cron, которое выводит на страницу basic.html, которая делает более или менее то, что я пытался сделать. – Hoppo

0

Если добавить 2>&1 к вашей команде оболочки, вы должны получить STDERR и STDOUT вернулся, которые, по крайней мере, поможет вам определить, что происходит:

<?php 

$output = shell_exec("./brew.sh >2&1"); 
echo $output; 

?> 
+0

Теперь я получаю 2 файла, один из которых называется test.txt, который пуст, а другой называется 2, который также пуст! – Hoppo

+0

Проверить определение и комментарии пользователей [здесь] (http://php.net/shell_exec). –

+0

@ DigitalChris: сценарий не выводит _have_, он состоит из одной команды, которая перенаправляет свой стандартный вывод в файл.Это тот файл, который OP хочет увидеть заполненным –

Смежные вопросы