1

我正在运行一个脚本(在 AWS EC2 实例上运行),该脚本不断从 API 中提取州立法数据,并将其保存到 SQLite3 .db 文件中。当我尝试在后台将脚本作为守护进程运行时,该进程立即停止,并且出现以下错误。

stateleg.rb: process with pid 4666 started.
Traceback (most recent call last):
    11: from stateleg_daemon.rb:4:in `<main>'
    10: from /usr/local/rvm/gems/ruby-2.5.1/gems/daemons-1.3.1/lib/daemons.rb:149:in `run'
     9: from /usr/local/rvm/gems/ruby-2.5.1/gems/daemons-1.3.1/lib/daemons/cmdline.rb:121:in `catch_exceptions'
     8: from /usr/local/rvm/gems/ruby-2.5.1/gems/daemons-1.3.1/lib/daemons.rb:150:in `block in run'
     7: from /usr/local/rvm/gems/ruby-2.5.1/gems/daemons-1.3.1/lib/daemons/controller.rb:59:in `run'
     6: from /usr/local/rvm/gems/ruby-2.5.1/gems/daemons-1.3.1/lib/daemons/application.rb:307:in `start'
     5: from /usr/local/rvm/gems/ruby-2.5.1/gems/daemons-1.3.1/lib/daemons/application.rb:228:in `start_load'
     4: from /usr/local/rvm/gems/ruby-2.5.1/gems/daemons-1.3.1/lib/daemons/application.rb:228:in `load'
     3: from /home/ubuntu/stateleg.rb:8:in `<top (required)>'
     2: from /home/ubuntu/stateleg.rb:8:in `new'
     1: from /usr/local/rvm/gems/ruby-2.5.1/gems/sqlite3-1.4.1/lib/sqlite3/database.rb:89:in `initialize'
/usr/local/rvm/gems/ruby-2.5.1/gems/sqlite3-1.4.1/lib/sqlite3/database.rb:89:in `open_v2': unable to open database file (SQLite3::CantOpenException)

当我尝试在前台运行脚本时,脚本运行完美,必要的信息被写入 .db 文件。

如何让这个守护进程打开数据库文件?SQLite3 和 Ruby 守护进程在某种程度上不兼容吗?任何信息都会非常有帮助。

这是守护程序脚本的全部内容。

require 'daemons'

Daemons.run('stateleg.rb')
4

1 回答 1

1

当某些东西被“守护”时,它通常运行在与您期望的不同的工作目录中。对于在启动时启动的服务尤其如此,例如通过systemd或在cron上。

为了解决这个问题,您需要指定要使用的文件的完整路径。这些被称为绝对路径,因为它们不受当前工作目录的影响。/a/b/c是绝对路径,它以 开头/,但是b/c是相对的。如果你在/a它是等效的,但它不会在这个范围之外工作。

如果您知道该文件相对于脚本的位置,通常可以这样做:

Daemons.run(File.expand_path('stateleg.rb', __dir__))

__dir__当前执行的脚本文件存放的目录在哪里。

于 2019-05-24T18:05:07.343 回答