Ubuntu 22.04 VPS上Rails应用DelayedJob自动退出问题
解决DelayedJob处理完任务后自动退出的问题
环境信息
- Ubuntu 22.04 VPS
- Rails 7.1.2,Ruby 3.0.0
- Passenger + Apache2,Ruby路径:
PassengerRuby /opt/rbenv/versions/3.0.0/bin/ruby
核心问题
启动DelayedJob后,处理完所有待执行任务就自动退出,无法保持持续运行;但直接在终端执行相同命令时,无任务也能正常驻留。
已尝试的方案(均无效)
用whenever配置@reboot定时任务
定时任务命令:@reboot /bin/bash -l -c 'cd /var/www/extranet-rails/durbano-rails && RAILS_ENV=production /opt/rbenv/shims/bundle exec rake delayed_jobs:start --silent >> log/cron.log 2>&1'自定义的
delayed_jobs:startRake任务:namespace :delayed_jobs do desc 'Start delayed jobs' task start: :environment do system("/opt/rbenv/shims/bundle /var/www/extranet-rails/durbano-rails/bin/delayed_job start") end end用systemd服务+Foreman启动
systemd配置文件:[Unit] Description=Delayed Job Workers After=network.target [Service] Type=simple Environment="RAILS_ENV=production" WorkingDirectory=/var/www/extranet-rails/durbano-rails ExecStart=/var/www/extranet-rails/durbano-rails/script.sh Restart=on-failure RestartSec=5 StandardOutput=syslog StandardError=syslog SyslogIdentifier=delayed_job [Install] WantedBy=multi-user.target启动脚本
script.sh:#!/bin/bash cd /var/www/extranet-rails/durbano-rails export RAILS_ENV=production echo "Starting foreman..." >> myapp.log 2>&1 /opt/rbenv/shims/foreman start >> myapp.log 2>&1 echo "Foreman terminated with exit code $?" >> myapp.log 2>&1Foreman的Procfile:
delayed: /opt/rbenv/shims/bundle exec bin/delayed_job start
解决办法
1. 切换DelayedJob为前台运行模式
bin/delayed_job start是后台运行模式,在cron或systemd环境下可能因缺少终端关联导致进程退出。改用run参数让它前台执行,交给进程管理器托管:
- 修改Foreman的Procfile:
delayed: /opt/rbenv/shims/bundle exec bin/delayed_job run - 同时调整systemd服务的重启策略,确保无任务时也能保持运行:
Restart=always
2. 修复自定义Rake任务的命令错误
原Rake任务里的bundle命令缺少exec参数,导致执行异常,修正为:
namespace :delayed_jobs do desc 'Start delayed jobs' task start: :environment do system("/opt/rbenv/shims/bundle exec /var/www/extranet-rails/durbano-rails/bin/delayed_job start") end end
3. 补全环境变量
cron和systemd的环境变量比终端少,需明确加载rbenv环境:
- 修改whenever的定时命令,加入rbenv初始化:
@reboot /bin/bash -l -c 'source $HOME/.rbenv/profile && cd /var/www/extranet-rails/durbano-rails && RAILS_ENV=production bundle exec rake delayed_jobs:start --silent >> log/cron.log 2>&1'
4. 简化systemd配置(跳过Foreman)
直接让systemd托管DelayedJob,去掉Foreman环节:
修改systemd配置的ExecStart:
ExecStart=/opt/rbenv/shims/bundle exec bin/delayed_job run
保留Restart=always,让systemd持续监控并维持进程运行。
验证步骤
修改配置后执行以下命令生效:
sudo systemctl daemon-reload sudo systemctl restart delayed_job.service
用ps aux | grep delayed_job查看进程状态,等待一段时间后再次检查,确认进程未退出。
内容的提问来源于stack exchange,提问作者Kévin Guiot
相关产品推荐
相关产品推荐

