找不到文件或目录 @ rb_sysopen - tmp/pids/puma.pid

23

我正试图启动 Puma,但在最后一步它失败了,错误信息如下:

16:38:09 web.1  | /home/ramonpm/.rvm/gems/ruby-2.2.7/gems/puma-3.9.1/lib/puma/launcher.rb:130:in `initialize': No such file or directory @ rb_sysopen - tmp/pids/puma.pid (Errno::ENOENT)
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/gems/puma-3.9.1/lib/puma/launcher.rb:130:in `open'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/gems/puma-3.9.1/lib/puma/launcher.rb:130:in `write_pid'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/gems/puma-3.9.1/lib/puma/launcher.rb:103:in `write_state'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/gems/puma-3.9.1/lib/puma/single.rb:92:in `run'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/gems/puma-3.9.1/lib/puma/launcher.rb:174:in `run'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/gems/puma-3.9.1/lib/puma/cli.rb:77:in `run'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/gems/puma-3.9.1/bin/puma:10:in `<top (required)>'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/bin/puma:23:in `load'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/bin/puma:23:in `<main>'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/bin/ruby_executable_hooks:15:in `eval'
16:38:09 web.1  |   from /home/ramonpm/.rvm/gems/ruby-2.2.7/bin/ruby_executable_hooks:15:in `<main>'
16:38:09 web.1  | exited with code 1
16:38:09 system | sending SIGTERM to all processes

在其他地方找不到解决方案,它们都与不同的事物有关。

3个回答

50

可以通过手动创建必要的文件夹来解决问题,这样服务器进程就可以创建pid文件。

mkdir -p tmp/pids

3
“使用 Rails 作为 Puma 进程 ID 文件的默认位置是 tmp/pids/server.pid,但实际上仍需要手动解决进程问题,感觉很奇怪吧?” - DannyB
7
启动服务器时,Rails 会在初始化过程中自动创建这个文件夹,方法是使用 bundle exec rails server (puma) 命令。 如果使用 bundle exec puma 启动服务器,则会跳过这个文件夹的创建,从而导致错误。 但如果两个命令都能产生相同的结果,那么就可以避免类似这样的错误。 - Harm de Wit
4
顺带一提,如果您的应用程序需要推送到服务器(例如Heroku),并且如果您之前在.gitignore中有/tmp/*,则需要在pids文件夹中添加.keep文件,重新添加pids文件夹(和.keep文件)到git repo使用git add -f,并在.gitignore中添加一个排除项以不排除pids文件夹和.keep文件。 - jpw
4
mkdir -p tmp/pids 的意思是递归创建一个名为 tmp/pids 的目录。 - 7urkm3n
1
当您更新.gitignore以允许新路径进入Docker镜像时,请不要忘记更新您的.dockerignore文件。 - Barry

9
当我通过Rails 5.2的rails app:update命令将puma.rb文件加入到Heroku应用程序中时,出现了这个错误。
# Specifies the `pidfile` that Puma will use.
pidfile ENV.fetch("PIDFILE") { "tmp/pids/server.pid" }

通过添加tmp/pids/.keep文件解决问题。

$ touch tmp/pids/.keep

.gitignore 文件更新如下。

# Ignore all logfiles and tempfiles.
/log/*
/tmp/*
!/log/.keep
!/tmp/.keep

# Ignore pidfiles, but keep the directory.
/tmp/pids/*
!/tmp/pids/
!/tmp/pids/.keep

我觉得这是更好的解决方案(尽管我承认我需要快速修复,所以我手动创建了目录)。 - iconoclast

3
您可以在 config/puma.rb 文件中添加此内容:
require "fileutils"
FileUtils.mkdir_p("tmp/pids")

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接