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

Inotify脚本建立监视后无法继续执行的问题求助

嘿,我来帮你搞清楚这个问题——你的脚本其实没“卡壳”,只是你可能对inotifywait的运行机制不太熟悉而已!

为什么脚本会停滞?

inotifywait默认是阻塞式单事件监听:它启动后先输出“Setting up watches. Watches established.”,然后就会一直“蹲守”在那儿,直到监测到你指定的文件系统事件(modify/create/delete)才会退出,接着进入循环执行rsync。执行完rsync后,它又会重新启动inotifywait继续蹲守。

所以在你没对/home/My_home/ITB/uploads做任何文件操作的时候,脚本就会停在inotifywait的阻塞状态,看起来像停滞,但这其实是它的正常工作状态。

不过你的脚本还有几个可以优化的点,能让它更符合“实时备份”的预期:

优化后的脚本

我给你调整了脚本,解决了几个潜在问题,还加了日志方便排查:

#!/bin/bash
# 定义日志文件路径,你可以改成自己喜欢的位置
LOG_FILE="/var/log/backup_sync.log"
# 确保日志目录存在
mkdir -p $(dirname $LOG_FILE)

# 记录启动时间
echo "$(date '+%Y-%m-%d %H:%M:%S'): 启动实时备份服务" >> $LOG_FILE

while true; do
    # 使用-m参数让inotifywait持续监听,不用每次循环重启,更高效
    # 加上-r参数监听子目录的变化(原脚本没加,会漏掉子目录的操作)
    inotifywait -m -e modify,create,delete,move -r /home/My_home/ITB/uploads >> $LOG_FILE 2>&1
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 检测到文件变化,开始同步..." >> $LOG_FILE
    # rsync源目录末尾加/,目标目录对应设置,避免在目标里多出一层uploads目录
    # 加上--delete让目标和源完全同步(可选,如果你需要删除目标中已在源删除的文件)
    rsync -avz --delete /home/My_home/ITB/uploads/ /home/My_home/destination/uploads/ >> $LOG_FILE 2>&1
    echo "$(date '+%Y-%m-%d %H:%M:%S'): 同步完成" >> $LOG_FILE
done

关键改进点:

  • -m/--monitor:让inotifywait持续监听事件,不用每次循环重新启动,提升效率
  • -r/--recursive:监听目标目录下的所有子目录,避免漏掉子目录的文件变化
  • 新增move事件:监听文件移动/重命名的操作,覆盖更全面的场景
  • rsync路径末尾加/:确保源目录的内容直接同步到目标目录,而不是在目标里创建新的uploads子目录
  • 日志输出:所有操作都记录到日志文件,方便后续排查问题
  • --delete参数:可选,如果你需要让目标目录和源目录完全一致(删除源已删除的文件)

测试与后台运行

  1. 测试脚本:
    运行脚本后,在/home/My_home/ITB/uploads下创建、修改或删除一个文件,比如touch test.txt,然后查看日志文件cat /var/log/backup_sync.log,应该能看到同步触发的记录,说明脚本正常工作。

  2. 后台运行:
    如果想让脚本在退出终端后继续运行,可以用nohup:

    nohup ./your_backup_script.sh &
    

    输出会默认写到nohup.out,或者你已经在脚本里指定了日志文件,就看你设置的日志路径。

  3. 开机自启:
    如果你想让脚本开机自动运行,可以做成systemd服务:

    • 创建服务文件:sudo nano /etc/systemd/system/backup-sync.service
    • 写入以下内容(替换your_username和脚本路径):
      [Unit]
      Description=实时文件备份同步服务
      After=network.target
      
      [Service]
      User=your_username
      ExecStart=/path/to/your_backup_script.sh
      Restart=always  # 脚本意外退出时自动重启
      
      [Install]
      WantedBy=multi-user.target
      
    • 启用并启动服务:
      sudo systemctl daemon-reload
      sudo systemctl enable backup-sync.service
      sudo systemctl start backup-sync.service
      

内容的提问来源于stack exchange,提问作者Mansoor

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.26 10:58:03