Сценарий Ruby не может открыть файл SQLite3, но только при запуске в качестве демона - PullRequest
1 голос
/ 13 мая 2019

Я запускаю скрипт (работающий на экземпляре 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')

1 Ответ

0 голосов
/ 24 мая 2019

Когда что-то «демонизируется», оно обычно работает в другом рабочем каталоге, чем вы ожидаете.Это особенно верно для сервисов, которые запускаются при загрузке, например, через systemd или cron .

. Чтобы учесть это, необходимо указатьполный путь к файлам, с которыми вы собираетесь работать.Они называются абсолютными путями , поскольку на них не влияет текущий рабочий каталог./a/b/c - это абсолютный путь, он начинается с /, но b/c является относительным.Если вы находитесь в /a, это эквивалентно, но оно не будет работать вне этой области.

Если вы знаете расположение этого файла относительно вашего сценария, вы обычно можете сделать это:

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

Где __dir__ - каталог, в котором хранится исполняемый в данный момент файл сценария.

...