命令输出模式后,终止数据库查询

时间:2017-05-27 01:01:29

标签: bash

我有以下命令从数据库下载文件,然后检查其完整性并退出:

cmd_db -get file_1

输出中:

Getting file_1
Transferring data (10% done)
Transferring data (20% done)
...
Transferring data (90% done)
Transferring data (100% done)
Getting MD5
ERROR: stream broke
Exiting...

文件正确下载但在错误发生后被删除。 当输出达到“100%完成”时,我设法手动终止命令。 手动检查MD5后,文件实际上很好。 我的连接有问题,我已经花了好几天试图解决这个问题。到目前为止,手动查杀是唯一有效的解决方案。

所以,我正在尝试自动执行查杀,但以下命令都不起作用。程序实际上在达到“100%完成”时停止生成输出,但一直持续到结束并擦除文件。

cmd_db -get file_1 | sed '/100% done/q'
cmd_db -get file_1 | while read line; do test "$line" = "100% done" && killall; done
until cmd_db -get file_1 | grep -m 1 "100% done"; do : ; done

还有其他办法吗?

1 个答案:

答案 0 :(得分:0)

好吧,因为我不知道你的命令是什么,所以我必须解决它。首先,将命令的输出重定向到grep,这将查找“100%完成”命令。并把它放在一个文件中。把整件事放在后台:

cmd_db -get file_1 | grep '100% done' > tmp$$ &

您将需要该进程ID,以便我们以后可以将其删除:

child=$!

现在,在我们获取该字符串之前,该文件将为空。把自己置于一个无限循环中,测试文件大小,直到它大于零,然后终止子进程并跳出循环:

while true; do
  [ $( wc -c tmp$$ | cut -d' ' -f1 ) -gt 0 ] && { kill -9 $child; break; }
done
祝你好运!