Laravel - Linux (Ubuntu) Процесс в реальном времени и вывод результатов на веб-страницу (блейд) - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу получить в реальном времени вывод запущенного процесса на моем сервере.Для скрипта я сделал что-то простое в bash:

Скрипт 1 (script.sh).

#!/bin/bash

y=0;

while [ $y > 0 ]; do
y=$((y+1))
sleep 1;
echo $y
echo "I am baking pies. I have $y so far."
done

Скрипт 2 (test.sh).

#!/bin/bash

~/script.sh > /dev/null &
pid=$!

echo $pid
strace -e trace=write -s1000 -fp $pid 2>&1 \
| grep --line-buffered -o '".\+[^"]"' \
| grep --line-buffered -o '[^"]\+[^"]' \
| while read -r line; do
printf "%b " $line;
done

Роль второго скрипта состоит в том, чтобы запустить первый, получить его pid и затем отследить вывод этого pid.На стороне сервера этого должно быть достаточно, но я могу ошибаться.Тем не менее, на стороне laravel я не мог найти способ получить вывод этого сценария в реальном времени.

Laravel, используя Symfony (на примере документации Symfony: https://symfony.com/doc/current/components/process.html).

$process = new Process(['/test.sh']);
$process->run();

// executes after the command finishes
if (!$process->isSuccessful()) {
    throw new ProcessFailedException($process);
}

echo $process->getOutput();

Скрипт работает почти так, как и должно быть, но есть проблема:

Когда скрипт запускается, laravel только печатает pid и не ждет вывода команды strace. Теперь есть ли способполучить реальный вывод скрипта во время его работы? Если невозможно использовать только Laravel и Symfony, могу ли я добиться этого с помощью VueJS (с которым я знаком и практиковался в последние несколько месяцев)?

1 Ответ

0 голосов
/ 14 февраля 2019

да, вы можете сделать так

например, я создал один скрипт test.sh и сохранил в корневой проект laravel ..

a=0

while [ $a -lt 10 ]
do
   echo $a
   sleep 1
   a=`expr $a + 1`
done

если вы пользователь Ubuntu, то дайте разрешение на выполнение разрешения файла сценария, подобного этому

sudo chmod +x test.sh

теперь в laravel create new console command

php artisan make: команда test

<?php

namespace App\Console\Commands;

use Illuminate\Console\Command;
use Symfony\Component\Process\Process;

class test extends Command
{
    /**
     * The name and signature of the console command.
     *
     * @var string
     */
    protected $signature = 'test';

    /**
     * The console command description.
     *
     * @var string
     */
    protected $description = 'test description';

    /**
     * Create a new command instance.
     *
     * @return void
     */
    public function __construct()
    {
        parent::__construct();
    }

    /**
     * Execute the console command.
     *
     * @return mixed
     */
    public function handle()
    {
        $process = new Process([base_path('test.sh')]);
        $process->start();

        foreach ($process as $type => $data) {
            if ($process::OUT === $type) {
                info($data);    //output store in log file..
                $this->info($data);  //show output in console..
                //       $this->info(print_r($data,true)) // if output is array or object then used
            } else {
                $this->warn("error :- ".$data);
            }
        }

        $this->info("get output");
    }
}

для получения дополнительной информации прочитайте статью

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...