Cron 不会 运行 Rails Puma 服务器在 Ubuntu 中自动

Cron doesn't run Rails Puma server automatically in Ubuntu

我使用 Capistrano 在 Digital Ocean Ubuntu 服务器中部署了一个 Rails 应用程序。由于某种原因,puma 服务器突然停止。不知道是什么原因。

这就是我创建脚本的原因 /home/deploy/startup-script.sh 该脚本包含在守护程序

中启动 Rails 应用程序的命令
#!/bin/bash

echo "Running Puma Server"
touch hello.txt
cd /srv/www/apps/app/current
bundle exec puma -C /srv/www/apps/app/shared/puma.rb --daemon

然后我 运行 这个脚本每分钟都使用 Cron。 我的 crontab -e 包含

* * * * * ./startup-script.sh

1 分钟后,我注意到它创建了一个 hello.txt 文件,但我的 Puma 服务器未 运行ning。 但是当我 运行 它手动使用 ./startup-script.sh 它会 运行 服务器。

puma_error.log

Puma starting in single mode...
* Version 4.3.1 (ruby 2.6.0-p0), codename: Mysterious Traveller
* Min threads: 0, max threads: 8
* Environment: production
* Daemonizing...
=== puma startup: 2020-09-21 05:16:28 +0000 ===
=== puma startup: 2020-09-21 05:17:39 +0000 ===
* Listening on tcp://0.0.0.0:9292
=== puma startup: 2020-09-21 06:11:35 +0000 ===
- Gracefully stopping, waiting for requests to finish
=== puma shutdown: 2020-09-21 06:11:35 +0000 ===

production.log

 Item Load (0.3ms)  SELECT  "items".* FROM "items" WHERE "items"."id" =  LIMIT   [["id", 208], ["LIMIT", 1]]
  CACHE Unit Load (0.0ms)  SELECT  "units".* FROM "units" WHERE "units"."id" =  LIMIT   [["id", 4], ["LIMIT", 1]]
  Item Load (0.3ms)  SELECT  "items".* FROM "items" WHERE "items"."id" =  LIMIT   [["id", 215], ["LIMIT", 1]]
  CACHE Unit Load (0.0ms)  SELECT  "units".* FROM "units" WHERE "units"."id" =  LIMIT   [["id", 4], ["LIMIT", 1]]
  Item Load (0.2ms)  SELECT  "items".* FROM "items" WHERE "items"."id" =  LIMIT   [["id", 198], ["LIMIT", 1]]
  CACHE Unit Load (0.0ms)  SELECT  "units".* FROM "units" WHERE "units"."id" =  LIMIT   [["id", 10], ["LIMIT", 1]]
  Rendering text template
  Rendered text template (0.0ms)
Sent data Delivery Receipt 12-2020-001.pdf (0.5ms)
Completed 200 OK in 4326ms (Views: 0.3ms | ActiveRecord: 37.4ms)

puma_access.log

=== puma startup: 2020-12-01 01:07:13 +0000 ===

启动 startup-script.sh 脚本时,我得到了这个

Running Puma Server
Puma starting in single mode...
* Version 4.3.1 (ruby 2.6.0-p0), codename: Mysterious Traveller
* Min threads: 0, max threads: 8
* Environment: production
* Daemonizing...

我的 droplet 仍然是 运行ning,但是 9292 端口上的 puma 运行ning 在崩溃时消失了,所以我怀疑这是 puma 错误。

我认为 puma 不会自己停下来。也许它不 运行 作为守护进程?我建议弄清楚发生了什么。

也就是说,为了确保某个守护进程始终处于运行状态并且 运行 你应该使用像 supervisord 这样的工具:http://supervisord.org/

cronjob 不是正确的工具。

根据您的 Puma 版本,--daemon 选项可能已弃用。使用 & 代替:

bundle exec puma -C /srv/www/apps/app/shared/puma.rb &

但是,您的问题不在于 Cron 或 Puma。除非发生其他事情,否则 Puma 不会自行退出。我建议您查看错误日志并找出真正的问题。

编辑:

回答您的评论:

  1. 我建议您将 Puma 更新到最新的 4.x 版本(当前为 4.3.6)。如果您可以切换到 Puma 5.x(当前为 5.1),那就更好了。一直都有错误修复和改进。也许您的问题与已解决的错误有关。

  2. 如果更新到 5.x 版本系列,则需要将 --daemon 替换为上面提到的 &

旁注:

但是,我仍然相信有一个错误报告,您没有注意到您的工具集未能记录。

我不知道你是否查看了 Capistrano logs 以及 Rails / Puma 日志和 DigitalOcean 服务器日志。

如果您是 运行 Puma 和 --debug,一些 Puma 消息必须出现在日志中。