问题:我有一个简单的自定义备份脚本,设置为在检测到备份驱动器时运行,这是通过udev完成的。一切顺利,直到大约一半的脚本,似乎在rsync命令后挂起。我的代码如下:
#!/bin/bash
#Mount the Backup Drive
wall "backup is starting"
mount -U f91b8373-6349-4de3-86e1-6a2557f2c3f7 /media/backupdrive
#Get updated package-list
mv /media/backupdrive/package-selections /media/backupdrive/package-selections.old
dpkg --get-selections >/media/backupdrive/package-selections
wall "pacakge list updated"
#Run Backup
mv /home/user/backup/rsync.log /home/user/backup/rsync.log.old
rsync --log-file=/media/backupdrive/backup/rsync.log -ravzX --delete --exclude /var/tmp --exclude /var/lock --exclude /var/run /home /etc /var /usr /media/backupdrive/backup
wall "rsync complete"
#Sync changes to disk and unmount
sync
cp /media/backupdrive/backup/rsync.log /home/user/backup/rsync.log
umount /media/backupdrive
wall "Backup is complete, the logfile can be viewed at /home/user/backup/rsync.log"
问题:我在这里做错了什么,为什么脚本在rsync之后没有继续?
PS - 墙上的命令对我把它们放在各个点进行故障排除的脚本并不重要,是的,我是新手:)
编辑 - 我已尝试删除类似问题中提到的“z”选项,但这没有任何区别
答案 0 :(得分:1)
它就像udev中的RUN命令超时一样。 您可以直接从udev运行备份脚本(通常需要很长时间才能完成),而不是直接从udev运行备份脚本。
例如,您可以使用at
命令:
ACTION=="add", KERNEL=="sd*", ENV{ID_FS_UUID_ENC}=="f91b8373-6349-4de3-86e1-6a2557f2c3f7", RUN+="/home/steve/backup/backup_at.sh"
backup_at.sh:
#!/bin/sh
echo /home/steve/backup/backup.sh | at now
或者您可以尝试在后台运行它:
ACTION=="add", KERNEL=="sd*", ENV{ID_FS_UUID_ENC}=="f91b8373-6349-4de3-86e1-6a2557f2c3f7", RUN+="/home/steve/backup/backup.sh &"
但我不会检查这种方法。
来自http://lists.freedesktop.org/archives/systemd-devel/2012-November/007390.html:
从udev规则启动任何长时间运行的任务是完全错误的 而你应该期待它会被杀死。如果你需要发射一个 从udev规则处理,使用ENV {SYSTEMD_WANTS}来激活a 服务。