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 授权。
一旦 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 授权。