挂载命令后如何启动systemd服务

Lol*_*ans 7 centos systemd services

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

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

我试过的

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

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

“创建一个单元文件,在安装后/mnt/backup 立即使用 rsync复制所有文件/dev/xvdc1。”

我知道的:

  1. 将安装的设备将始终为 /dev/xvdc1
  2. 设备的挂载点将始终为 /mnt/backup
  3. 服务必须根据/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
Run Code Online (Sandbox Code Playgroud)

Cen*_*ane 4

Systemd 单元启动条件

使用 ConditionPathExists= 在启动单元之前检查文件存在条件。如果指定的绝对路径名不存在,则条件将失败。如果传递给 ConditionPathExists= 的绝对路径名带有感叹号(“!”)前缀,则测试将被否定,并且仅当路径不存在时才启动单元。

ConditionPathIsMountPoint= 与 ConditionPathExists= 类似,但验证某个路径是否存在并且是挂载点。

似乎最简单的方法是包括

ConditionPathIsMountPoint=/mnt/backup
Run Code Online (Sandbox Code Playgroud)

在你的[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或任何您所说的服务