udev规则无法正常工作,可能是逃避问题

时间:2017-02-03 09:27:33

标签: bash vagrant udev

我尝试在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;'时,它确实有效。

有什么想法吗?

1 个答案:

答案 0 :(得分:0)

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

  

这只能用于非常短时间运行的前台任务。长时间运行事件过程可能会阻止此设备或从属设备的所有其他事件。启动守护进程或其他长时间运行的进程不适用于udev;在事件处理完成后,分离或未分离的分叉进程将被无条件地终止。

所以你的方法必须改变。但是,让我们假设命令pm2 start daemon.json适当地短暂运行:无论如何,你的问题很有意思,因为类似的引用嵌套问题经常出现。因此,请将此答案的其余部分作为一般情况的示例。

不要对正确的转义序列感到生气,你可以写

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.d/vagrant_daemon后,通过编辑includedir /etc/sudoers.d或(更好)将其写入新文件/etc/sudoers来设置正确的sudo授权。