2015-03-23 2 views
0

Мне нужно запустить в фоновом режиме команду оболочки (которая использует ruby-скрипт из/usr/local/bin), используя php (из формы html/php) и игнорируя весь вывод. Я пробовал безуспешно exec(), system(), shell_exec().Запуск рубиновых скриптов из php игнорирования вывода

Выполнение сценария (не написанного мной, script link - я не знаю рубина) в терминале и перенаправления стандартного вывода на/dev/null, он продолжает показывать информацию в реальном времени о ходе загрузки и скорости от загрузки до его завершения.

Я полагаю, это из-за сценария, и я где-то читал, что proc_open() может помочь, но я не знаю, как его использовать.

EDIT

Кроме того, добавив «&» в команду (в терминале) он продолжает показывать в реальном времени Infos о прогрессе загрузки и скорость загрузки, пока не будет завершено.

ответ

0
/usr/local/apache2/htdocs$ ls 
1.php ruby_prog.rb 

1.php:

<div>hello</div> 
<div> 
<?php 

$command = 'ruby ruby_prog.rb'; 
$output = []; 
exec($command, $output, $return_var); 
echo($output[0]); 

?> 
</div> 

ruby_prog.rb:

puts 'world' 

URL:

http://localhost:8181/1.php 

выход в браузере:

hello 
world 

Источник HTML:

<div>hello</div> 
<div> 
world</div> 

Вы можете проверить значение $return_var --Если это 0, то программа рубин побежал успешно; если он отличен от нуля, произошла ошибка.

Если вы не хотите какой-либо вывод, то вы можете использовать команду:

ruby ruby_prog.rb > /dev/null 2>&1 

> отправляет стандартный вывод в/DEV/нуль, который является раковина, т.е. он действует как Blackhole , и 2>&1 говорит, что отправляет stderr (2) туда, где идет stdout (& 1).

+0

Это не работает ... Я получаю только первую строку вывода, и скрипт не продолжает выполнение ... Запуск скрипта в терминале, выход обновляется каждую секунду до завершения, а затем, возможно, это создает проблемы с «фоновым запуском» Мне нужно – lebrac

+0

@lebrac, * это создает проблемы с «фоновым запуском», мне нужно * - Вы ничего не сказали об этом в своем вопросе. – 7stud

+0

@lebrac, добавьте пробел плюс '&' до конца команды - тогда exec() не будет блокироваться. – 7stud

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