我有这段代码
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?
答案 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.txt
或vim 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)