Create a Custom Systemd Service for Scheduled Rsync Backups on Ubuntu 22.04
原理
使用systemd
服务,可以创建一个同名的backup-sync.timer
和backup-sync.service
在/etc/systemd/system
目录下,timer根据设定的时间自动出发service,然后将rsync备份脚本路径配置在service中便可达到效果。
具体步骤
添加rysnc脚本
sudo vim /usr/local/bin/backup-sync.sh
在里面添加如下内容:
#!/bin/bash
#/usr/local/bin/backup-sync.sh
# Configuration
SOURCE_DIR="source_dir"
REMOTE_HOST="user@dest_ip"
DEST_DIR="dest_dir"
# Check network connectivity
echo "Starting network check..."
if ! ping -c 1 8.8.8.8 >/dev/null 2>&1; then
echo "ERROR: No internet connectivity"
exit 1
fi
echo "Network check passed"
if ! timeout 100 ssh -q -o BatchMode=yes -o ConnectTimeout=50 $REMOTE_HOST "echo 2>&1"; then
echo "ERROR: Cannot connect to remote server via SSH"
exit 1
fi
echo "Ssh check passed"
echo "Starting rsync backup..."
rsync -avz "$SOURCE_DIR" "$REMOTE_HOST:$DEST_DIR"
if [ $? -eq 0 ]; then
echo "Backup completed successfully"
exit 0
else
echo "ERROR: Backup failed with exit code $?"
exit 1
fi
其中参数的意思如下
- -a:archive 模式,是一系列flag的组合包括如下内容
- -r recursive模式,拷贝包括子目录
- -l 拷贝软链接
- -p 保留权限
- -t 保留修改时间
- -g 保留用户和组信息
- -o 保留所有者
- -D 保留设备文件和特殊文件
- -v 打印出具体信息包括拷贝的文件
- -z 拷贝前进行压缩,如果拷贝的是视频或者已经压缩过的文件可以省略这个flag
- –delete 如果源目录删除某个文件,则将在目标目录也删除对应的文件(此flag比较危险,如果目标目录也可能有修改则应去掉这个参数)
最后给脚本运行的权限:
sudo chmod +x /usr/local/bin/backup-sync.sh
添加systemd service文件
sudo vim /etc/systemd/system/backup-sync.service
在文件中添加如下内容
[Unit]
Description=Rsync Backup Service
After=network.target
[Service]
Type=oneshot
ExecStart=/usr/local/bin/backup-sync.sh
User=your-username
[Install]
WantedBy=multi-user.target
添加timer文件
sudo vim /etc/systemd/system/backup-sync.timer
在文件中添加如下内容
[Unit]
Description=Timer for Rsync Backup Service
[Timer]
OnBootSec=15min
OnUnitActiveSec=6h
AccuracySec=1min
[Install]
WantedBy=timers.target
服务开机自启
# Reload systemd to recognize new service
sudo systemctl daemon-reload
# Enable and start the timer
sudo systemctl enable backup-sync.timer
sudo systemctl start backup-sync.timer
# You can also run the service manually to test
sudo systemctl start backup-sync.service
注意不能enable backup-sync.service
,因为service应该由timer触发,如果enable backup-sync.service
,那么开机可能触发两次导致重复。
后续查看log信息
运行命令:
journalctl -u backup-sync.service