蚊章汇 - 电脑棒
type: channel
link: https://linuxcn.bwsl.wang/tag/%E7%94%B5%E8%84%91%E6%A3%92/
items: Systemd 服务：响应变化

Systemd 服务：响应变化
type: item
date: 2020-05-12T08:11:20+08:00
description: 我有一个这样的电脑棒（图1），我把它用作通用服务器。它很小且安静，由于它是基于 x86 架构的，因此我为我的打印机安装驱动没有任何问题，而且这就是它大多数时候干的事：与客厅的共享打印机和扫描仪通信。一个英特尔电脑棒。欧元硬币大小。大多数时候它都是闲置的，尤其是当我们外出时，因此我认为用它作监视系统是个好主意。该设备没有自带的摄像头，也不需要一直监视。我也不想手动启动图像捕获，因为这样就意味着在出门前必须通过 SSH 登录，并在 shell 中编写命令来启动该进程。因此，我以为应该这么做：拿一个 USB 摄像头，然后只需插入它即可自动启动监视系统。如果这个电脑棒重启后发现连接了摄像头也启动监视系统就更加分了。在先前的文章中，我们看到 systemd 服务既可以手动启动或停止，也可以在满足某些条件时启动或停止。这些条件不限于操作系统在启动或关机时序中达到某种状态，还可以在你插入新硬件或文件系统发生变化时进行。你可以通过将 Udev 规则与 systemd 服务结合起来实现。有 Udev 支持的热插拔Udev 规则位于 /etc/udev/rules 目录中，通常是由导致一个 动作 action 的 条件 conditions 和 赋值 assignments 的单行语句来描述。有点神秘。让我们再解释一次：通常，在 Udev 规则中，你会告诉 systemd 当设备连接时需要查看什么信息。例如，你可能想检查刚插入的设备的品牌和型号是否与你让 Udev 等待的设备的品牌和型号相对应。这些就是前面提到的“条件”。然后，你可能想要更改一些内容，以便以后可以方便使用该设备。例如，更改设备的读写权限：如果插入 USB 打印机，你会希望用户能够从打印机读取信息（用户的打印应用程序需要知道其模型、制造商，以及是否准备好接受打印作业）并向其写入内容，即发送要打印的内容。更改设备的读写权限是通过你之前阅读的“赋值” 之一完成的。最后，你可能希望系统在满足上述条件时执行某些动作，例如在插入某个外部硬盘时启动备份程序以复制重要文件。这就是上面提到的“动作”的例子。了解这些之后, 来看看以下几点:ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="e207", SYMLINK+="mywebcam", TAG+="systemd", MODE="0666", ENV{SYSTEMD_WANTS}="webcam.service"规则的第一部分,ACTION=="add", SUBSYSTEM=="video4linux", ATTRS{idVendor}=="03f0", ATTRS{idProduct}=="e207" [etc... ]表明了执行你想让系统执行的其他动作之前设备必须满足的条件。设备必须被添加到（ACTION=="add"）机器上，并且必须添加到 video4linux 子系统中。为了确保仅在插入正确的设备时才应用该规则，你必须确保 Udev 正确识别设备的制造商（ATTRS{idVendor}=="03f0"）和型号（ATTRS{idProduct}=="e207"）。在本例中，我们讨论的是这个设备（图2）：这个试验使用的是 HP 的摄像头。注意怎样用 == 来表示这是一个逻辑操作。你应该像这样阅读上面的简要规则：如果添加了一个设备并且该设备由 video4linux 子系统控制，而且该设备的制造商编码是 03f0，型号是 e207，那么…但是，你从哪里获取的这些信息？你在哪里找到触发事件的动作、制造商、型号等？你可要使用多个来源。你可以通过将摄像头插入机器并运行 lsusb 来获得 IdVendor 和 idProduct ：lsusb Bus 002 Device 002: ID 8087:0024 Intel Corp. Integrated Rate Matching Hub Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub Bus 003 Device 003: ID 03f0:e207 Hewlett-Packard Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub Bus 001 Device 003: ID 04f2:b1bb Chicony Electronics Co., Ltd Bus 001 Device 002: ID 8…