Bash 顺序命令。无需启动新线程即可调用函数

Bash 顺序命令。无需启动新线程即可调用函数

我有以下脚本(在解释和问题的末尾)。

有两个函数。第一个函数调用了 Firefox -print 扩展。如果我逐行运行它,一切都会正常。

问题在于,在 bash 脚本中,firefox 在几秒钟内被调用多次,而不是一次调用一次并等待完成。

我不想在函数中添加睡眠功能,因为我不知道它需要多长时间。

有什么方法可以强制 bash 不启动线程?(我想是这样做的)

谢谢。

这是我的脚本。(由于命令 let,它是 bash 而不是 sh)

#!/bin/bash

####TODO###
####variables
# join files
# send with attachment

## Date, to be used as reference on tmp files
DATE=`date +%Y%m%d`
## File where all webs to report are listed
WEBSFILE="/home/marc.riera/Desktop/reports/websfile.txt"
## Where to store all the files. 
WORKDIR="/home/marc.riera/Desktop/reports"

##################do not edit under this line
TMPDIR=$WORKDIR/$DATE
test -d $TMPDIR || mkdir -p $TMPDIR && echo "Create folder $TMPDIR for temporal usage"
REPORT=$WORKDIR/Report_$DATE.pdf

##firefox -print "http://fbmsgga01/ganglia/?m=cpu_report&r=month&s=descending&c=CPU+cluster&h=&sh=1&hc=4&z=small" -printmode pdf -printdelay 5 -printfile ~/Desktop/reports/test.pdf
firefoxprint (){
     web2Print=$1
     outputFile=$2
     echo -n "printing $1 on $2"
     firefox -print "$web2Print" -printmode pdf -printdelay 5 -printfile $outputFile
}

##gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=dospdf.pdf -dBATCH ganglia.pdf test.pdf
pdfjoin (){
     outputFile=$1
     origA=$2
     origB=$3
     echo -n "Joining $origA and $origB into $outputFile"
     gs -dNOPAUSE -sDEVICE=pdfwrite -sOUTPUTFILE=$outputFile -dBATCH $origA $origB
}


###################################### MAIN
#######################################
clear
COUNTER=0
for web in `cat $WEBSFILE|grep -v '^#'`
do
     firefoxprint $web $TMPDIR/$COUNTER.pdf
     let COUNTER+=1
done
echo "--------------------" $COUNTER
while [ $COUNTER -gt 0 ]; do
    let COUNTER=COUNTER-1
    pdfjoin $REPORT $REPORT $TMPDIR/$COUNTER.pdf
done

echo "done"
exit 0

答案1

如果有正在运行的 Firefox,则调用firefox只需联系它,传输打印请求并立即退出。打印请求在正在运行的实例中异步执行。我不知道是否有办法在打印完成时收到通知。

一种解决方法(未经测试)是在脚本中创建一个新的配置文件(用随机名称解压准备好的 zip 文件)。您可以运行多个 Firefox 实例,只要它们使用不同的配置文件即可。一旦 Firefox 退出,删除临时配置文件。这假设打印扩展不会让 Firefox 实例继续运行;如果是这样,您可以对其进行破解,使其在完成后退出 Firefox。

答案2

我不太熟悉如何使用 FireFox 进行打印,但您玩过 bash 的wait命令吗?您可以给它输入要等待的特定 PID。因此,按照您的某个 Firefox 打印命令,您可以直接执行wait $!。或者,如果您不指定任何命令,而只是使用wait,它将直接等待所有子进程完成。

我无法保证 FireFox 能很好地支持这一点。但值得一试。

答案3

在 firefoxprint() 例程末尾添加:

  while [ ! -s $outputFile ]; do
    sleep 1
  done

这至少能让你一些延迟 - 它会等待,直到出现非零长度的输出文件后再继续。希望这会使其速度足够慢,以便后续调用将使用现有的 Firefox,而不会认为它们必须生成自己的 Firefox。

答案4

只需等待一次即可实现。

a)在 Firefox 上创建专用的配置文件以进行打印:

Firefox-no-remote-ProfileManager

b) 通过 firefox -no-remote -P 启动 firefox

c) 等待

相关内容