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