redmine、puma、nginx 和 crontab

问题描述

想让 puma 在系统重启时自动启动。

这是我的 crontab 行(标准用户):

# m h  dom mon dow   command
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/local/bin:/usr/bin
HOME=/home/seven/

@reboot /home/seven/mars/start.sh

文件 start.sh

#!/bin/bash

/usr/bin/screen -dmS mars /home/seven/mars/puma -e production

是我自己运行文件吗:

./start.sh

一切正常,屏幕启动,puma 启动。布里尔

但是如果我重新启动机器,什么也没有发生,屏幕和美洲狮没有加载。 我做错了什么?

非常感谢

解决方法

运行 puma 的一种可能方法是使用 systemd,正如 Puma 的团队在 https://github.com/puma/puma/blob/master/docs/systemd.md

这种方式也能让你 只需输入

即可重新启动服务

systemctl restart redmine

你可以通过

获得状态

systemctl status redmine

所以输出看起来像:

● redmine.service - Puma HTTP Server
   Loaded: loaded (/etc/systemd/system/redmine.service; enabled; vendor preset: enabled)
   Active: active (running) since Sun 2021-01-03 06:25:16 CET; 2 days ago
 Main PID: 29598 (ruby)
    Tasks: 6 (limit: 4915)
   CGroup: /system.slice/redmine.service
           └─29598 puma 4.2.1 (tcp://0.0.0.0:3000) [redmine]

Jan 03 06:25:17 srv-redmine puma[29598]: Puma starting in single mode...
Jan 03 06:25:17 srv-redmine puma[29598]: * Version 4.2.1 (ruby 2.6.3-p62),codename: Distant Airhorns
Jan 03 06:25:17 srv-redmine puma[29598]: * Min threads: 0,max threads: 16
Jan 03 06:25:17 srv-redmine puma[29598]: * Environment: development
Jan 03 06:25:19 srv-redmine puma[29598]: * Listening on tcp://0.0.0.0:3000
Jan 03 06:25:19 srv-redmine puma[29598]: Use Ctrl-C to stop

将以下代码放入:/etc/systemd/system/redmine.service

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

[Service]
Type=simple
# Preferably configure a non-privileged user
User=testuser

# Specify the path to your puma application root
WorkingDirectory=/home/testuser/redmine

# Helpful for debugging socket activation,etc.
# Environment=PUMA_DEBUG=1
# Setting secret_key_base for rails production environment. We can set other Environment variables the same way,for example PRODUCTION_DATABASE_PASSWORD
#Environment=SECRET_KEY_BASE=b7fbccc14d4018631dd739e8777a3bef95ee8b3c9d8d51f14f1e63e613b17b92d2f4e726ccbd0d388555991c9e90d3924b8aa0f89e43eff800774ba29

# The command to start Puma,use 'which puma' to get puma's bin path,specify your config/puma.rb file
ExecStart=/home/testuser/.rvm/wrappers/my_app/puma -C /home/testuser/redmine/config/puma.rb
Restart=always
KillMode=process
#RemainAfterExit=yes
#KillMode=none

[Install]
WantedBy=multi-user.target

通过将 testuser 替换为您的真实 Redmine 用户,确保调整上述代码中的用户和路径以适合您的系统。

puma.rb 文件看起来像这样:

port        ENV['PORT'] || 3000
stdout_redirect '/home/testuser/redmine/log/puma.stderr.log','/home/testtser/redmine/log/puma.stdout.log'
#daemonize true
#workers 3
#threads 5,5
on_worker_boot do
  ActiveSupport.on_load(:active_record) do
    ActiveRecord::Base.establish_connection
  end
end

有关 puma 配置的更多信息,请查看: https://github.com/puma/puma

,

感谢 Aleksandar Pavić 指出我可以使用 systemd !!! 我是那种如果我想以一种方式工作的人,我会忽略其他一切,因为我想首先按照我想要的方式工作。简而言之,我是个笨蛋。

Systemd 最终并没有那么简单,但是阅读 puma 文档有很大帮助。 我的 redmine.service 文件:

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

# Uncomment for socket activation (see below)
#Requires=puma.socket

[Service]
Type=simple
#WatchdogSec=10

# Preferably configure a non-privileged user
User=seven

# Specify the path to your puma application root
WorkingDirectory=/home/seven/mars/

# The command to start Puma,specify your config/puma.rb file
ExecStart=/bin/bash -lc '/home/seven/.rvm/gems/ruby-2.7.2/bin/puma -C /home/seven/mars/config/puma.rb'
Restart=always
KillMode=process

[Install]
WantedBy=multi-user.target

还有我的 puma.rb

# config/puma.rb
workers Integer(ENV['PUMA_WORKERS'] || 2)
threads Integer(ENV['MIN_THREADS']  || 0),Integer(ENV['MAX_THREADS'] || 16)

rackup      DefaultRackup
port        ENV['PORT']     || 9292
environment ENV['RACK_ENV'] || 'production'

lowlevel_error_handler do |e|
    Rollbar.critical(e)
    [500,{},["An error has occurred,and engineers have been informed. Please reload the page. If you continue to have problems,contact hq@starfleet-command.co\n"]]
end

在这个 systemd 开始工作后,有一个例外。当我想启用该过程时,仍然出现错误:

sudo systemctl enable redmine.service
Synchronizing state of redmine.service with SysV service script with /lib/systemd/systemd-sysv-install.
Executing: /lib/systemd/systemd-sysv-install enable redmine
update-rc.d: error: cannot find a LSB script for redmine

我需要删除 /etc/init.d/ 中的 redmine 文件并再次启用 redmine.service 以重新创建启动脚本

现在一切正常:) 非常感谢大家!!!

,

您的详细信息不足以回答,但在您的情况下,我认为您手动创建了 crontab 文件。如果是这样,为什么您不使用以下命令添加 cron 作业:

crontab -e

如果您想手动添加它,请确保您的文件具有 execute mode,将其添加到 /etc/cron.d 并使用 sudo service cron reload 重新加载您的 cron 服务。 但如果它对您没有帮助,请尝试使用以下命令查看日志:

journalctl -xe

这可以帮助您在系统重新启动时调试您的作业。

,

所以,这是 start.sh 脚本:

#!/bin/bash
DISPLAY=:0; export DISPLAY
SHELL=/bin/bash
PWD=/home/seven/mars
LOGNAME=seven
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/home/seven
LANG=C.UTF-8
USER=seven

# main script to start screen and after puma.sh
cd /home/seven/mars/ && /usr/bin/screen -dmS mars /home/seven/puma.sh

我没有做的是,我正在尝试从 cron 启动的脚本中运行第二个脚本。美洲狮 内容:

#!/bin/bash
DISPLAY=:0; export DISPLAY
SHELL=/bin/bash
PWD=/home/seven/mars
LOGNAME=seven
XDG_SESSION_TYPE=tty
MOTD_SHOWN=pam
HOME=/home/seven
LANG=C.UTF-8
USER=seven

# main script to start puma
cd /home/seven/mars/ && puma -e production -w 2 -t 0:16

当我手动运行启动脚本时:Cli 中的 ./start.sh 一切正常。 当我重新启动机器(ubuntu 20.04 LTS)时,脚本被触发,屏幕启动但第二个脚本没有启动。

现在,我尝试将 puma -e 生产...放在 screen -dmS mars ...(没有第二个脚本行)之后,但结果是在重新启动后屏幕无法启动。

同样,start.sh 在 Cli 下手动触发时工作正常,只是在 Cron 触发时不行,而且不完全。