redmine、puma、nginx 和 crontab

redmine, puma, nginx and 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 都没有加载。 我做错了什么?

非常感谢

您的详细信息不足以回答,但在您的情况下,我认为您手动创建了 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 正在启动的脚本。 puma.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 puma
cd /home/seven/mars/ && puma -e production -w 2 -t 0:16

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

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

同样,start.sh 在 Cli 下手动触发时完美运行,只是在由 Cron 触发时不完美,还不完全。

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

这样也能让你 只需键入

即可重新启动服务

systemctl重启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 config 的更多信息,请查看: 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, use 'which puma' to get puma's bin path, 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 以重新创建启动脚本

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