我尝试在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;'
时,它确实有效。
有什么想法吗?
答案 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授权。