我正在使用rsync
将文件从服务器传输到另一台服务器(均由我拥有),我唯一的问题是这些文件超过50GB而且我有大量的文件要传输(超过200)他们)。
现在我可以打开多个标签并运行rsync
或添加“&”在脚本的末尾,在后台执行它。
所以我的问题是,如何在后台执行此命令,当它完成传输时,我希望在执行脚本的终端窗口上显示一条消息。
(rsync -av -progress [FOLDER_NAME] [DISTINATION]:[PATH] &) && echo 'Finished'
我知道这完全错了,但我需要使用&在后台运行它和&&在rsync完成后运行echo。
答案 0 :(得分:1)
你可以使用gnu屏幕,屏幕可以monitor输出静音和活动。额外的好处 - 您可以关闭终端并稍后重新连接到屏幕 - 如果您可以在服务器上运行屏幕更好 - 那么您可以关闭或重新启动您的计算机并且屏幕上的进程仍在执行。
答案 1 :(得分:1)
在基于screen
的解决方案旁边,您也可以使用xargs
工具。
echo '/srcpath1 host1 /dstpath1
/srcpath2 host2 /dstpath2
/srcpath3 host3 /dstpath3'| \
xargs -P 5 --max-lines 1 bash -e 'rsync -av -progress $1 $2:$3'
xargs
读取stdin的输入,并为每个单词或行执行命令。这一次,行。
它做得非常好:它可以与其子进程并行执行!在此配置中,xargs通过始终使用5个并行子进程来完成此操作。这个数字可以是1甚至无限。
xargs将退出,如果它的所有子节点都准备就绪,并且处理每个ctrl / c,子处理等,并且容错。
echo
的输入可以来自文件,也可以来自管道中的上一个命令,而不是xargs
。或者来自for
或while
循环。
答案 2 :(得分:0)
嗯,回答你的具体问题,你的调用:
(rsync ... &) && echo 'Finished'
创建一个子shell - ( ... )
位 - 其中rsync
在后台运行,这意味着子shell将在它开始rsync
后立即退出,而不是rsync
之后1}}完成。然后&& echo ...
部分注意到子shell已成功退出并执行其操作,这不是您想要的,因为rsync
很可能仍在运行。
要完成你想要的,你需要这样做:
(rsync ... && echo 'Finished') &
这会将子shell本身放在后台,子shell将运行rsync
然后echo
。如果您需要等待子shell在稍后的某个时间点完成,只需在适当的位置插入wait
。
您也可以这样构建它:
rsync ... &
# other stuff to do while rsync runs
wait
echo 'Finished'
哪个“更好”实际上只是一个偏好问题。仅当&&
未报告错误退出代码时,echo
才会运行rsync
,但将&&
替换为;
会产生一个小的差别这两种模式更相同。第二种方法使echo
与脚本中的其他输出同步,因此它不会显示在其他输出的中间,因此从这方面可能稍微优先,但是捕获{{的退出条件1}}如果有必要会更复杂......