You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何让Bash脚本检测到锁文件存在时不重复连接rsync守护进程

解决Bash脚本重复连接rsync守护进程的问题

要避免脚本在rsync守护进程lock文件存在时无限重试,只需在循环中加入lock文件检查逻辑,每次重试前先判断对应模块的lock文件是否存在,存在则直接退出脚本。

修改后的完整脚本

#!/bin/sh

# 指定对应rsync模块的lock文件路径
LOCK_FILE="/var/run/rsyncd-home.lock"

while [ 1 ]
do
    # 检查lock文件是否存在
    if [ -f "$LOCK_FILE" ]; then
        echo "Rsync守护进程lock文件已存在,已有连接在运行,退出脚本"
        exit 1
    fi

    cputool --load-limit 7.5 -- nice -n -15 rsync -avxP --no-i-r --rsync-path="rsync" --log-file=/var/log/rsync-home.log --exclude 'snap'  --exclude 'lost+found' --exclude=".*" --exclude=".*/" 127.0.0.1::home /media/username/external/home-files-only && sync && echo 3 > /proc/sys/vm/drop_caches
    
    if [ "$?" = "0" ] ; then
        echo "rsync completed normally"
        exit
    else
        echo "Rsync failure. Backing off and retrying..."
        sleep 10
    fi
done

#end of shell script

关键修改说明

  • 定义LOCK_FILE变量,指向你rsyncd配置中home模块对应的lock文件路径/var/run/rsyncd-home.lock
  • 在每次循环的最开头加入文件存在检查:if [ -f "$LOCK_FILE" ]; then ... exit 1,一旦检测到lock文件存在,直接输出提示并退出脚本,不再执行后续的rsync命令和重试逻辑

额外说明

rsync守护进程在正常处理连接时会自动创建lock文件,连接结束后会自动删除。如果遇到rsync意外崩溃导致lock文件残留的情况,你需要手动删除对应的lock文件才能重新运行脚本。如果需要更严谨的处理,可以在检查lock文件的同时,验证是否有对应的rsync进程在运行,示例逻辑如下:

if [ -f "$LOCK_FILE" ]; then
    # 检查lock文件中的PID是否对应运行中的rsync进程
    PID=$(cat "$LOCK_FILE" 2>/dev/null)
    if [ -n "$PID" ] && ps -p "$PID" >/dev/null 2>&1; then
        echo "Rsync守护进程正在运行,退出脚本"
        exit 1
    else
        echo "发现残留的lock文件,已自动清理"
        rm -f "$LOCK_FILE"
    fi
fi

内容的提问来源于stack exchange,提问作者B-zaro

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 08:54:26