我尝试在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
。