安排命令运行的最佳方式是什么?确保先前的一组命令已经完成?

也就是说,我需要旋转备份文件夹。 我有很多机器按计划rsync到单个备份机器。 虽然我安排备份在深夜开始,并安排文件夹轮换(使文件夹day0成为day1,从最早开始)在第二天早上(例如,提供10小时备份完成) ,我希望能够在允许轮换开始之前完成所有备份,而不是做出假设(因为如果在备份过程中轮换文件夹,我的备份不准确)。

这对于一台机器来说是微不足道的,但对于一些机器来说,我希望有人知道最好的方法…我可以考虑一些,但是宁愿不必在运行系统上进行“试验”:

让每个备份创build一个完成标记,并在一定时间后每隔几分钟运行一次循环脚本,检查它是否已经成功运行,并且所有标记都是最新的(比上一个循环脚本标记更早)?

让每个备份mv他们以前的rsync到一个正在进行的文件夹,rsync,然后mv回到day0所以轮换只是跳过备份,如果它不完整?

只是住在可能不准确的备份?

我可能会写一个完成文件到中央服务器,包括date和主机名; 你可以使用这个:

#!/bin/bash # when each backup completes, write a completion file: ssh user@central-server "touch /path/to/completion-files/$HOST-$(date +%F).complete" 

在中央服务器上:

 #!/bin/bash # on the central server, run this before attempting folder rotation for h in (list of hosts); do if [[ -e "/path/to/completion-files/$h-$(date +%F)" ]]; then # do your thing fi done 

攻击更普遍的情况,即“ 安排命令运行的最佳方式什么,确保先前的一组命令已经完成?

您需要运行命令并testing成功(退出代码),然后您可以使用系统调度程序(通常为at )来调度命令。 例如:

  #!/bin/bash rsync "${opts[@]}" "$source" "$dest" if [[ $? -eq 0 ]]; then at now+10hours <<<"~jdoe/bin/rotatefolders.sh" fi 

我在这里假设你的文件夹循环脚本被命名为rotatefolders.shbin的jdoe的home文件夹中。

既然你使用的是rsync,我假设你通过ssh-tunnel来做这个。 如果是这样,你也有ssh。

而不是一个繁忙的等待循环,最好在rsync-job完成时使用信号。

“信号”可以触发backup.server系统上的日志旋转 – 可以直接启动logrotate,也可以间接启动(通过sudo或ssh-key)。

你可以使用pid文件:

 PID_FILE="/path/to/pid.pid" if [ -f $PID_FILE ] then OLD_PID=`cat $PID_FILE` RUNNING=`ps aux |grep $OLD_PID|grep -v grep|wc -l` if [ $RUNNING -gt 0 ] then echo "WARNING PROGRAM already running" exit 0 else echo "PID file exists but program is not running. Overriding PID file" fi fi echo $$ > $PID_FILE trap "rm -f $PID_FILE; exit" INT TERM EXIT 

共享pid文件,你将确保B不会运行,直到A完成,相反。