从 Rails 启动 systemd 用户服务
Start systemd user service from Rails
我需要在 Rails 从 Ruby 启动 systemd 服务。我的 ruby 代码使用反引号调用 systemctl:
`systemctl --user start myservice`
它不起作用,我认为这与执行命令的用户有关。 Rails 在 Passenger 上是 运行,其用户应该与我的服务相同。
我也试过了alternative ways to launch a subprocess
(这应该是评论而不是答案,但我仍在建立 'reputation' 点,所以...)
如果 Passenger 具有与 myservice
和 运行 相同的 UID,那么这不是问题所在。启动 child 的其他方式也不太可能改变结果。
我建议捕获子进程的输出如下:
systemctl --user start myservice > /tmp/systemctl.output 2>&1
然后在子进程失败后检查输出文件。
我通过告诉 shell 在哪里可以为用户找到正确的 DBUS 来解决问题。我将环境变量 XDG_RUNTIME_DIR 设置为用户的 DBUS 位置,在我的例子中为 1001。检查 echo $UID
以查找用户 ID,我无法使用此内联。
`export XDG_RUNTIME_DIR="/run/user/1001" && systemctl --user start myservice`
感谢D.j。 Molny 的首字母 post 和 NeilCasey 的 the remainder
我需要在 Rails 从 Ruby 启动 systemd 服务。我的 ruby 代码使用反引号调用 systemctl:
`systemctl --user start myservice`
它不起作用,我认为这与执行命令的用户有关。 Rails 在 Passenger 上是 运行,其用户应该与我的服务相同。
我也试过了alternative ways to launch a subprocess
(这应该是评论而不是答案,但我仍在建立 'reputation' 点,所以...)
如果 Passenger 具有与 myservice
和 运行 相同的 UID,那么这不是问题所在。启动 child 的其他方式也不太可能改变结果。
我建议捕获子进程的输出如下:
systemctl --user start myservice > /tmp/systemctl.output 2>&1
然后在子进程失败后检查输出文件。
我通过告诉 shell 在哪里可以为用户找到正确的 DBUS 来解决问题。我将环境变量 XDG_RUNTIME_DIR 设置为用户的 DBUS 位置,在我的例子中为 1001。检查 echo $UID
以查找用户 ID,我无法使用此内联。
`export XDG_RUNTIME_DIR="/run/user/1001" && systemctl --user start myservice`
感谢D.j。 Molny 的首字母 post 和 NeilCasey 的 the remainder