Rails 5.2.3应用如何配置多个systemd服务运行后台任务?
首先明确说:你应该创建单独的systemd服务来运行ActiveJob的后台进程,而不是试图在同一个服务里并行运行Puma和任务处理器。下面给你详细解释原因和操作步骤:
为什么不能用同一个服务?
你当前的rails.service是Type=simple,这种类型的systemd服务只会监控ExecStart里启动的第一个进程。如果你尝试在ExecStart里用&把Puma和rake jobs:work放在一起运行(比如bundle exec puma & bundle exec rake jobs:work),systemd只会跟踪Puma进程——后台任务进程如果意外崩溃,systemd不会察觉到,也不会自动重启它;而且当你重启rails.service时,可能无法正确停止后台任务进程,导致残留进程引发问题。
分开管理的好处太多了:各自的日志独立,方便排查问题;可以单独重启其中一个服务(比如更新后台任务逻辑后只重启任务服务,不用动主应用);systemd能分别监控两个进程,任何一个挂了都会自动帮你重启,保障服务稳定性。
具体操作步骤
1. 创建后台任务的systemd服务文件
新建一个名为/etc/systemd/system/rails-jobs.service的文件,内容如下:
[Unit] Description=Rails ActiveJob Background Worker Requires=network.target After=rails.service # 确保主应用服务启动后再启动后台任务 [Service] Type=simple Environment="RAILS_ENV=production" User=rails Group=rails WorkingDirectory=/home/rails/appname/current ExecStart=/bin/bash -lc 'bundle exec rake jobs:work' TimeoutSec=30s RestartSec=30s Restart=always # 进程意外终止时自动重启 [Install] WantedBy=multi-user.target
2. 加载配置并启动服务
执行以下命令让systemd识别新服务,设置开机自启并启动它:
sudo systemctl daemon-reload sudo systemctl enable rails-jobs.service sudo systemctl start rails-jobs.service
3. 验证服务状态
你可以用以下命令查看后台任务服务的运行状态和日志:
# 查看服务状态 sudo systemctl status rails-jobs.service # 查看实时日志 journalctl -u rails-jobs.service -f
额外提示
如果以后你打算换成Sidekiq、Resque这类更高效的后台任务处理器,只需要修改ExecStart的命令即可,服务文件的其他部分基本不用变。比如换成Sidekiq的话,ExecStart可以改成:
ExecStart=/bin/bash -lc 'bundle exec sidekiq -C config/sidekiq.yml'
内容的提问来源于stack exchange,提问作者Derek C

