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 以重新创建启动脚本
现在一切正常:)非常感谢大家!!!
想让 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 以重新创建启动脚本
现在一切正常:)非常感谢大家!!!