我正在为我的 Linux 课程做一个实验室,老师正在教我们有关 Systemd 的知识。
如何创建一个在使用以下命令安装特定设备时启动脚本的服务: mount /dev/xvdc1 /mnt/backup
我尝试过的
- 我使用计时器检查是否
/mnt/backup
是安装点。 (老师不会接受,必须是严格的事件驱动) - 创建 .mount 单元并使 .service 单元需要 .mount 单元。这种做法在执行命令时并没有启动脚本:
mount /dev/xvdc1 /mnt/backup
我想我可能以错误的方式处理这个问题。这是实验室的问题。
/mnt/backup
“创建一个单元文件,一旦/dev/xvdc1
安装,它就会使用 rsync 复制所有文件。”
我知道的:
- 将要安装的设备将始终是
/dev/xvdc1
- 设备的挂载点始终是
/mnt/backup
- Service必须根据
/dev/xvdc1
已挂载启动
这是我的 .service 单元文件
[Unit]
Description=Starts a backup for /dev/xvdc1 when mounted using the mount command.
[Service]
Type=simple
ExecStart=/root/backupscript.sh
ExecStop=/bin/kill -HUP $MAINPID
[Install]
WantedBy=multi-user.target
答案1
使用 ConditionPathExists= 在启动单元之前检查文件存在条件。如果指定的绝对路径名不存在,则条件将失败。如果传递给 ConditionPathExists= 的绝对路径名带有感叹号(“!”)前缀,则测试将被否定,并且仅当路径不存在时才启动单元。
ConditionPathIsMountPoint= 与 ConditionPathExists= 类似,但验证某个路径是否存在并且是挂载点。
似乎最简单的方法是包括
ConditionPathIsMountPoint=/mnt/backup
在你的[Unit]
部分。虽然这并没有检查哪个设备安装在那里,尽管在创建备份的情况下用户可能并不挑剔。
您可能还需要Restart=on-failure
继续尝试启动该服务。
更精确的方法是编写一条udev
规则,在安装特定设备时启动服务。
首先在 lsusb 中查找您的设备。记下 ID(例如 0a81:0101)
通过 sudoedit /etc/udev/rules.d/100-mount-videos.rules 在 /etc/udev/rules.d/ 中创建一个新的 udev 规则文件,并在其中添加一个新规则,如下所示:
ACTION==“添加”,ATTRS {idVendor} ==“0a81”,ATTRS {idProduct}==“0101”,RUN + =“/home/your_username/bin/mount_videos.sh”
您可以将其替换RUN+=
为RUN+=/usr/bin/systemctl start backup.service
或任何您所说的服务