gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:32:55 24 4
gpt4 key购买 nike

我想获取服务器上正在运行的进程的实时输出。对于脚本,我在 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(我在过去几个月中熟悉和实践过)来实现它?

最佳答案

是的,你可以那样做

例如,我创建了一个脚本 test.sh 并存储在 laravel 根项目 ..

a=0

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

if you are ubuntu user then give a permission to execute a script file permision like that

sudo chmod +x test.sh

现在在 laravel 中创建新控制台命令

php artisan make:command 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");
}
}

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

关于linux - Laravel - Linux(ubuntu) 实时处理并在网页上显示输出( Blade ),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54690016/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com