bash脚本从远程主机rsync自身-如何?

bash脚本从远程主机rsync自身-如何?,bash,rsync,Bash,Rsync,我有多个远程站点,它们运行由cron启动的bash脚本(运行频率非常高,不超过10分钟),其中一个任务是同步“scripts”目录。我的想法是能够在一个位置(数据中心的服务器)编辑脚本,而不必登录到每个远程站点并手动进行任何编辑。问题是,同步当前正在运行同步的脚本的最佳选项是什么?(我希望这是清楚的) 我想同步当前正在运行的脚本会非常糟糕。如果我将其作为脚本的最后一条语句运行,下面的内容看起来可行吗?赞成的意见?欺骗?其他选择 if [ -e ${newScriptPath} ]; then

我有多个远程站点,它们运行由cron启动的bash脚本(运行频率非常高,不超过10分钟),其中一个任务是同步“scripts”目录。我的想法是能够在一个位置(数据中心的服务器)编辑脚本,而不必登录到每个远程站点并手动进行任何编辑。问题是,同步当前正在运行同步的脚本的最佳选项是什么?(我希望这是清楚的)

我想同步当前正在运行的脚本会非常糟糕。如果我将其作为脚本的最后一条语句运行,下面的内容看起来可行吗?赞成的意见?欺骗?其他选择

if [ -e ${newScriptPath} ]; then
    mv ${newScriptPath} ${permanentPath}" | at "now + 1 minute"
fi

我看到的一个问题是,如果我使用“1分钟”(这是“at”的最小增量),脚本结束,cron在“at”替换脚本之前启动下一个作业,它可能会在脚本的下一次运行期间尝试替换它

在执行过程中更改脚本文件确实很危险(请参阅),但有一个技巧(至少在我测试的bash版本中)会强制bash将整个脚本读取到内存中,因此如果在执行过程中更改脚本,则不会产生任何效果。只需将脚本包装在
{}
中,并使用显式出口(在
{}
中),以便在文件末尾添加任何内容时不会执行:

#!/bin/bash
{
    # Actual script contents go here

    exit
}
警告:正如我所说,这在我测试过的bash版本上有效。我对其他版本或其他shell不做任何承诺。在投入生产使用之前,使用您将要使用的外壳进行测试

另外,在同步过程中是否存在任何其他脚本运行的风险?如果是这样,您需要对所有脚本使用此技巧,或者找到一些常规方法来检测正在使用的脚本,并将其更新推迟到以后。

因此,我最终使用了“at”实用程序,但仅当文件发生更改时才使用。我在本地机器上有一个“.cur”和“.new”版本的脚本。如果两者的MD5相同,我什么也不做。如果它们不同,我会等到主脚本完成后,然后强制将“.new”复制到另一个脚本中的“.cur”

我为update_脚本创建了相同的锁文件(名称),以便在更改第一个脚本时不会运行该脚本的另一个实例

主脚本中的一部分

file1=`script_cur.sh`
file2=`script_new.sh`

if [ "$file1" == "$file2" ] ; then
    echo "Files have the same content"

else
    echo "Files are different, scheduling update_script.sh at command"
    at -f update_script.sh now + 1 minute
fi