问题描述
想让 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 触发时不行,而且不完全。