假设我们有一个 bash,它将命令(显示在终端中)的输出输出到日志文件,如下所示:
#!/bin/bash
exec 3>&1
exec 1> logfile.log # logfile.log contains all what will be printed in terminal and it will keep updating its content till the script finish it is job
command#1
command#2
command#3
.
.
.
.
.
echo -n "Process is DONE ..."
exec 1>&3
exec 3>&-
如果此脚本需要几分钟才能完成,则可以通过一一运行其中包含的命令来完成。
这个脚本如何每秒打印一个点,直到找到“进程在文件“logfile.log”中完成”这句话?或者在屏幕上创建任何动作(即进度条或截图)只是为了显示进程仍在运行活?
答案1
在我看来,您使用的设计过于狡猾。您可以考虑以下设计:
#!/bin/bash
LOG=logfile.log
#echo $i #what's this for?
exec 3>&1
exec 1> "$LOG" # logfile.log contains all what will be printed in terminal and it will keep updating its content till the script finish it is job
#command1 &
sleep 5 &
sleep 10 &
sleep 15 &
for i in {1..7}; do
echo x
sleep 1
done &
#command2 &
#command3 &
#and so on...
exec 1>&3
exec 3>&-
echo Progress:
while [ $(jobs -pr | wc -l) -gt 0 ] ; do
#jobs
echo -n "."
sleep 1
done
echo -e "\nProcess is DONE ..." | tee -a "$LOG"
添加了几行说明性内容:
- 第 9-15 行是示例命令
- 第 24 行可以不进行哈希处理以显示逻辑
答案2
您是否需要寻找特定的字符串,或者在进程结束时停止观看就足够了?一种简单的方法可能是将输出通过pv
(手册页)以获得进度条,并且可以tail
在最后检查输出文件以查看最后发生了什么。
编造的例子:
./process.sh | pv > output.file ; tail -1 output.file
34 B 0:00:02 [16.8 B/s] [ <=> ]
Process done.