Bash命令在循环内部不起作用

时间:2014-09-17 06:58:18

标签: linux bash

我有这段代码

for f in ${CURRENT_IMAGE_FILES[@]}; 
do 
    echo "Checking if too many process are running"
    while :
    do
        RUNNING_PROCESS=`ps aux | grep [f]fmpeg -c`
        if [[ $RUNNING_PROCESS -gt 22 ]]
        then
            echo "Too many process running now, sleep for 1 second"
            sleep 1
        else
            echo "Total ffmpeg process running is less then 20, continue"
            echo "current process count is " $RUNNING_PROCESS
            break
        fi
    done
    convert $f -resize 1280x720 -gravity center $f
    composite -gravity center $f /var/bash/b.jpg $f
    ffmpeg -loop 1 -f image2 -i $f -c:v libx264 -pix_fmt yuvj420p -preset ultrafast -t 3 $DIR/$COUNT.mp4 &
    ((++COUNT))
done

问题是当放在for循环中时,grep命令会出错。使用方法:grep [OPTION] ... PATTERN [FILE] ...... 尝试使用`grep --help'获取更多信息。

但是当放在for循环之外时,我没有得到这样的错误。我的循环是否有问题干扰了grep?

3 个答案:

答案 0 :(得分:1)

您正在以错误的顺序使用options的grep,并且不需要[f]字符类。来自 man grep

grep [OPTIONS] PATTERN [FILE...]

因此,您应该将RUNNING_PROCESS命令更改为

RUNNING_PROCESS=`ps aux | grep -c ffmpeg`

此外,您为什么使用[f]fmpeg字符类 [f]只会匹配/扩展为f,因此请将其删除以防止grep将其解释为模式的一部分。此外,它没有帮助作为通配符,因为fmpeg将匹配ffmpeg匹配的任何内容。

答案 1 :(得分:1)

您正在使用

RUNNING_PROCESS=`ps aux | grep [f]fmpeg -c`

计算当前正在运行的ffmpeg的流程实例。

使用了[f],因此grep [f]fmpeg与自己的命令行不匹配,这很好。

但是有一个问题:[f]没有引用,因此shell可能会尝试解释它,具体取决于选项。

引用它应该使线路工作:

RUNNING_PROCESS=`ps aux | grep '[f]fmpeg' -c`

还有另一个问题:它不仅与ffmpeg -a foo -b bar ...匹配,还与less ffmpeg-manual.txtvim notes-on-ffmpeg-commands.txt匹配。

但是有更好的方法 - 使用正确的工具来完成工作。 ps是列出流程的权利,但对于匹配流程,pgrep更适合:

RUNNING_PROCESS=$(pgrep -c ffmpeg)

执行您所需要的操作,将ffmpeg的流程计入RUNNING_PROCESS

以上适用于pgrep个程序包procps,在Linux中很常见。有些版本不支持-c进行计数,或者使用-c进行其他操作。如果不起作用,请使用:

RUNNING_PROCESS=$(pgrep ffmpeg | wc -l)

pgrep负责自行匹配,因此无需[f]解决方法。
我还用$( ... )替换了后面的引号`...`,如果你需要嵌套它,它有一些优点。

如果您确实不仅需要匹配命令名称,还需要匹配命令行,请使用pgrep -f

答案 2 :(得分:0)

问题是您使用[ and] as grep`模式但模式未加引号。在BASH中试试这个:

RUNNING_PROCESS=$(ps aux | grep '[f]fmpeg' -c)

或者,如果你有pgrep,那么你可以使用:

RUNNING_PROCESS=$(pgrep -f 'ffmpeg' | wc -l)