Laravel-Linux(ubuntu)实时处理并在网页上显示输出(刀片)

时间:2019-02-14 12:04:16

标签: linux laravel shell symfony ubuntu

我想获得服务器上正在运行的进程的实时输出。对于脚本,我在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 Docs示例: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 :(得分:1)

是的,您可以这样做

例如,我创建了一个脚本 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中创建 new console command

  

php artisan make:command测试

<?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");
    }
}

有关更多信息,请阅读此article