如何在 mount 命令后启动 systemd 服务

如何在 mount 命令后启动 systemd 服务

我正在为我的 Linux 课程做一个实验室,老师正在教我们有关 Systemd 的知识。

如何创建一个在使用以下命令安装特定设备时启动脚本的服务: mount /dev/xvdc1 /mnt/backup

我尝试过的

  1. 我使用计时器检查是否/mnt/backup是安装点。 (老师不会接受,必须是严格的事件驱动)
  2. 创建 .mount 单元并使 .service 单元需要 .mount 单元。这种做法在执行命令时并没有启动脚本:mount /dev/xvdc1 /mnt/backup

我想我可能以错误的方式处理这个问题。这是实验室的问题。

/mnt/backup “创建一个单元文件,一旦/dev/xvdc1安装,它就会使用 rsync 复制所有文件。”

我知道的:

  1. 将要安装的设备将始终是/dev/xvdc1
  2. 设备的挂载点始终是/mnt/backup
  3. 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

Systemd 单元启动条件

使用 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或任何您所说的服务

相关内容