You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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后,处理完所有待执行任务就自动退出,无法保持持续运行;但直接在终端执行相同命令时,无任务也能正常驻留。

已尝试的方案(均无效)

  1. 用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:start Rake任务:

    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
    
  2. 用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>&1
    

    Foreman的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 12:12:37