我有以下脚本(在解释和问题的末尾)。
有两个函数。第一个函数调用了 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) 等待