如何让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
相关产品推荐
相关产品推荐

