无法为Puma创建systemd脚本

时间:2016-12-14 10:30:23

标签: ubuntu-16.04 puma systemd

我在"puma.service"中创建了一个名为/etc/systemd/system/的服务脚本,其中包含以下内容:

[Unit]
Description=Puma HTTP Server
After=network.target

[Service]
Type=simple

User=ubuntu

WorkingDirectory=/home/username/appdir/current

ExecStart=/bin/bash -lc "/home/username/appdir/current/sbin/puma -C /home/username/appdir/current/config/puma.rb /home/username/appdir/current/config.ru"

Restart=always

[Install]
WantedBy=multi-user.target

我启用了该服务,启动后,我从systemctl获取以下日志:

● puma.service - Puma HTTP Server
   Loaded: loaded (/etc/systemd/system/puma.service; enabled; vendor preset: enabled)
   Active: inactive (dead) (Result: exit-code) since Wed 2016-12-14 10:09:46 UTC; 12min ago
  Process: 16889 ExecStart=/bin/bash -lc cd /home/username/appdir/current && bundle exec puma -C /home/username/appdir..
 Main PID: 16889 (code=exited, status=127)

Dec 14 10:09:46 ip-172-31-29-40 systemd[1]: puma.service: Main process exited, code=exited, status=127/n/a
Dec 14 10:09:46 ip-172-31-29-40 systemd[1]: puma.service: Unit entered failed state.
Dec 14 10:09:46 ip-172-31-29-40 systemd[1]: puma.service: Failed with result 'exit-code'.
Dec 14 10:09:46 ip-172-31-29-40 systemd[1]: puma.service: Service hold-off time over, scheduling restart.
Dec 14 10:09:46 ip-172-31-29-40 systemd[1]: Stopped Puma HTTP Server.
Dec 14 10:09:46 ip-172-31-29-40 systemd[1]: puma.service: Start request repeated too quickly.
Dec 14 10:09:46 ip-172-31-29-40 systemd[1]: Failed to start Puma HTTP Server.

虽然,当我在SSH终端中发出命令时,服务器启动并且运行正常。我必须在服务文件中进行任何更改吗?

注意:

  1. 为方便起见,我更改了dirnames。
  2. 我做了一些研究,状态127的原因是由于可执行文件不在路径中。但是,我想这不会成为一个问题。
  3. 你能解决一些问题吗?

2 个答案:

答案 0 :(得分:8)

我发现了问题,并改变了下面提到的ExecStart,它就像一个魅力:

ExecStart=/home/username/.rbenv/shims/bundle exec puma -e production -C ./config/puma.rb config.ru
PIDFile=/home/username/appdir/shared/tmp/pids/puma.pid

bundle应该从rbenv填充程序中获取,并且puma的配置文件(config/puma.rb)和应用程序的配置文件(config.ru)可以在相对路径中获取。

答案 1 :(得分:0)

解决这个问题的一种方法是指定一个PID文件,systemd将查看该文件以检查服务状态。

以下是我们在脚本中使用它的方法(适用于您的给定样本)

ExecStart=/bin/bash -lc '/home/username/appdir/current/sbin/puma -C /home/username/appdir/current/config/puma.rb /home/username/appdir/current/config.ru --pidfile /home/username/appdir/current/tmp/pids/puma.pid'
PIDFile=/home/username/appdir/current/tmp/pids/puma.pid

请注意,您可能必须通过--pidfile文件配置-C puma.rb,而不是将其作为参数传递。我只是在这里展示它来说明--pidfile(在puma配置中)应该与服务文件中的PIDFile相同。

至于为什么错误信息就是这样,我不确定自己,也对答案感兴趣。