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

有什么想法吗?

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

这只能用于运行时间很短的前台任务。长时间运行事件进程可能会阻止此设备或从属设备的所有其他事件。启动守护进程或其他长时间运行的进程不适合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来设置正确的sudo授权,或者(更好)在/etc/sudoers中启用includedir /etc/sudoers.d后将其写入新文件/etc/sudoers.d/vagrant_daemon

最新更新