Bash脚本,在打印行时停止永远运行的进程

时间:2017-11-02 11:30:38

标签: bash process

我在Bash编写新脚本;我想要做的是运行一个永远运行的进程(即Gulp),并在打印到屏幕线时停止它。

在我的情况下,当我启动Gulp时,它打印数千行(大约需要20秒),然后它仍在等待;它打印的最后一行总是

[Browsersync] Serving files from: src

我尝试用这个脚本实现我的目标:

cd ~/mydir
gulp serve &
while read -r line; do
    if [ "$line"=="[Browsersync] Serving files from: src" ]; then
    echo 'pid of Gulp before killing it is : ' `pidof gulp`
    # Get its PID
    PID=$!
    kill -INT $PID
    echo 'pid of Gulp now is : ' `pidof gulp`
    fi
done

但这并不能阻止吞咽过程。我做错了什么?

编辑:请注意,这只是整个脚本的一部分。

1 个答案:

答案 0 :(得分:1)

您需要将后台运行程序的输出与read的输入相关联。

最简单的方法是将其作为bash coprocess运行:

  

协同进程在子shell中异步执行,就好像命令已使用&控制操作符终止,在执行的shell和协同进程之间建立了双向管道

命令的标准输出(gulp serve)将在COPROC[0]COPROC数组的第一个元素)中的文件描述符中提供,COPROC_PID中的PID将可用

例如:

#!/bin/bash
coproc gulp serve
while IFS= read -r line; do
    if [ "$line" == "[Browsersync] Serving files from: src" ]; then
        kill -INT "$COPROC_PID"
    fi
done <&"${COPROC[0]}"