Linux - 在后台同时执行shell脚本并知道它何时完成

时间:2015-01-13 15:45:53

标签: linux rsync

我正在使用rsync将文件从服务器传输到另一台服务器(均由我拥有),我唯一的问题是这些文件超过50GB而且我有大量的文件要传输(超过200)他们)。 现在我可以打开多个标签并运行rsync或添加“&”在脚本的末尾,在后台执行它。

所以我的问题是,如何在后台执行此命令,当它完成传输时,我希望在执行脚本的终端窗口上显示一条消息。

(rsync -av -progress [FOLDER_NAME] [DISTINATION]:[PATH] &) && echo 'Finished'

我知道这完全错了,但我需要使用&在后台运行它和&&在rsync完成后运行echo。

3 个答案:

答案 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。或者来自forwhile循环。

答案 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}}如果有必要会更复杂......