udev 规则无法正常工作,可能是转义问题

udev rule not working correctly, probably escaping issue

一旦 Vagrant 盒子上的挂载准备就绪,我会尝试 运行 udev 规则:

SUBSYSTEM=="bdi",ACTION=="add",RUN+="/usr/bin/screen -m -d bash -c 'sleep 5; cd /vagrant/; sudo -E su -c "pm2 start daemon.json" vagrant;'"

但该命令未 运行 正确执行,因为 pm2 未启动。 当我手动执行 /usr/bin/screen -m -d bash -c 'sleep 5; cd /vagrant/; sudo -E su -c "pm2 start daemon.json" vagrant;' 时它确实有效。

有什么想法吗?

嵌套引号肯定是问题的一部分,但更大的问题写在 udev manual:

This can only be used for very short-running foreground tasks. Running an event process for a long period of time may block all further events for this or a dependent device. Starting daemons or other long-running processes is not appropriate for udev; the forked processes, detached or not, will be unconditionally killed after the event handling has finished.

所以你的方法必须改变。但是,让我们假设命令 pm2 start daemon.json 是适当的 short-running:无论如何,你的问题很有趣,因为类似的 quote-nesting 问题经常出现。因此,请将此答案的其余部分作为一般情况的示例。

与其对正确的转义序列发火,不如写

RUN+="/usr/bin/screen -m -d bash -c 'sleep 5; cd /vagrant/; sudo -E -u vagrant pm2 start daemon.json"

一个更简单的解决方案可能是

RUN+="/usr/bin/screen -m -d /usr/local/bin/start_vagrant_daemon"

其中 /usr/local/bin/start_vagrant_daemon 是可执行的并且具有以下内容

#!/bin/bash
sleep 5
cd /vagrant/
sudo -E -u vagrant pm2 start daemon.json

这两种解决方案都需要通过编辑 /etc/sudoers 或(更好)在 /etc/sudoers 中启用 includedir /etc/sudoers.d 后将它们写入新文件 /etc/sudoers.d/vagrant_daemon 来设置正确的 sudo 授权。