在 Ubuntu 14.04 上,我有一个长时间运行的 bash 脚本,其中有一个简单的 udev 规则,它的工作原理如下:
ACTION=="change", SUBSYSTEM=="block", RUN+="/opt/script.sh"
Run Code Online (Sandbox Code Playgroud)
在 Ubuntu 16.04 上,事情进展得并不顺利。脚本开始运行,但在它完成之前就被杀死了。然后我尝试更改我的 udev 规则以调用一个可以分离脚本的 warapper 脚本。我试过:
ACTION=="change", SUBSYSTEM=="block", RUN+="/opt/script.sh"
Run Code Online (Sandbox Code Playgroud)
然后我尝试:
#!/bin/sh
nohup /opt/script.sh &
Run Code Online (Sandbox Code Playgroud)
无济于事。
然后我尝试创建一个 systemd 服务...
ACTION=="change", SUBSYSTEM=="block", ENV{SYSTEMD_WANTS}=="justrunthescript.service"
Run Code Online (Sandbox Code Playgroud)
/etc/systemd/system/justrunthescript.service
[Unit]
Description=Just run the script
[Service]
ExecStart=/opt/script.sh
Run Code Online (Sandbox Code Playgroud)
我必须在某个时候运行脚本,但我的脚本依赖于 udev 参数,如 $ID_FS_TYPE 不会以这种方式传递。
我想我想要的很简单,只需插入一张光盘并从 udev 规则运行我的脚本,不要杀死脚本。解决这个问题的最佳方法是什么?
我遇到了 udev 规则未运行的问题。下面是一个例子:
我有一个规则/etc/udev/rules.d/99-test.rules,其中包含:
ACTION=="add", SUBSYSTEM=="pci", ATTR{vendor}=="0x8086", RUN+="/sayhi"
Run Code Online (Sandbox Code Playgroud)
并且sayhi只有:
#!/bin/bash
date +"%Y-%m-%d %H:%M:%S,%3N" >> /saidhi
Run Code Online (Sandbox Code Playgroud)
这是一台英特尔机器,我显然有许多供应商 0x8086 PCI 设备:
root@imtrobot:~# lspci -n |grep 8086
00:00.0 0600: 8086:2770 (rev 02)
00:02.0 0300: 8086:2772 (rev 02)
00:1d.0 0c03: 8086:27c8 (rev 01)
[ etc. 12 lines total ]
Run Code Online (Sandbox Code Playgroud)
然而,当我启动时,/saidhi要么根本不创建,要么里面有 1 或 2 个日期行。
如果在启动后,我运行udevadm trigger --action=add --subsystem-match=pci 然后 /saidhi将获得添加到它的正确数量的日期。
为什么这在启动过程中不起作用?