Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 在命令输出模式后终止数据库查询_Bash - Fatal编程技术网

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

Bash 在命令输出模式后终止数据库查询,bash,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... 文件可以正确下载,但在错误发生后会

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

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

还有其他方法吗?

好的,因为我不知道你的命令是什么,我必须解决这个问题。首先,将命令的输出重定向到
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

祝你好运

谢谢!不幸的是,仍然存在同样的问题。下载文件的命令是数据库专有的java客户端,下载后的步骤可能发生得太快,以至于您无法停止它。你有java代码吗?