Запуск граблей из crontab - PullRequest
0 голосов
/ 05 января 2019

Я столкнулся с проблемой, решение которой не могу себе представить, и застрял на неделю. У меня есть следующие две строки в sudo crontab -e.

* * * * * echo "crontab can log to reports" >> /var/log/mazer-reports.log
* * * * * /bin/bash -l -c 'cd /home/deploy/shopify_pull_and_store && /home/deploy/.rbenv/shims/bundle exec rake run_split_accounting_after_close_master >> /var/log/mazer-reports.log'

Вот как выглядит мой 'mazer-reports.log' примерно через 10 минут:

crontab can log to reports
crontab can log to reports
crontab can log to reports
crontab can log to reports
crontab can log to reports
crontab can log to reports
crontab can log to reports
crontab can log to reports
crontab can log to reports
crontab can log to reports
crontab can log to reports

Итак, первая команда запускается и логируется нормально. Однако вторая команда не регистрирует и не запускает соответствующую задачу rake (эффекты задачи не видны в моем приложении Rails). Кроме того, я знаю, что в команде нет ничего плохого, потому что, если я просто возьму эту команду и запущу ее в своей консоли:

/bin/bash -l -c 'cd /home/deploy/shopify_pull_and_store && /home/deploy/.rbenv/shims/bundle exec rake run_split_accounting_after_close_master >> /var/log/mazer-reports.log'

Затем к моему «mazer-reports.log» добавляется следующее:

   (0.8ms)  SELECT MAX("delayed_jobs"."priority") FROM "delayed_jobs" WHERE "delayed_jobs"."queue" = $1  [["queue", "RunReports"]]
   [ActiveJob]    (0.1ms)  BEGIN
   [ActiveJob]   SQL (0.4ms)  INSERT INTO "delayed_jobs" ("handler", "run_at", "queue", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  
   [["handler", "--- !ruby/object:ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper\njob_data:\n  job_class: RunReportsSplitMasterJob\n  job_id: 79333d26-4917-4226-8d86-8fef481c86d0\n  provider_job_id: \n  queue_name: RunReports\n  priority: \n  arguments: []\n  executions: 0\n  locale: en\n"], ["run_at", "2019-01-04 22:06:35.189280"], ["queue", "RunReports"], ["created_at", "2019-01-04 22:06:35.189369"], ["updated_at", "2019-01-04 22:06:35.189369"]]
   [ActiveJob]    (0.5ms)  COMMIT
   [ActiveJob] Enqueued RunReportsSplitMasterJob (Job ID: 79333d26-4917-4226-8d86-8fef481c86d0) to DelayedJob(RunReports)

А также я могу видеть влияние запуска задачи на мое приложение rails, где я не смог увидеть его из crontab, так что это не может быть просто проблемой регистрации. crontab не любит команду вообще. Вот вывод sudo grep CRON /var/log/syslog:

Jan  4 22:12:01 shopify-inventory-reports CRON[24417]: (root) CMD (echo "crontab can log to reports" >> /var/log/mazer-reports.log)
Jan  4 22:12:03 shopify-inventory-reports CRON[24415]: (CRON) info (No MTA installed, discarding output)
Jan  4 22:13:01 shopify-inventory-reports CRON[24453]: (root) CMD (/bin/bash -l -c 'cd /home/deploy/shopify_pull_and_store && /home/deploy/.rbenv/shims/bundle exec rake run_split_accounting_after_close_master >> /var/log/mazer-reports.log')
Jan  4 22:13:01 shopify-inventory-reports CRON[24454]: (root) CMD (echo "crontab can log to reports" >> /var/log/mazer-reports.log)
Jan  4 22:13:03 shopify-inventory-reports CRON[24452]: (CRON) info (No MTA installed, discarding output)
Jan  4 22:14:01 shopify-inventory-reports CRON[24490]: (root) CMD (/bin/bash -l -c 'cd /home/deploy/shopify_pull_and_store && /home/deploy/.rbenv/shims/bundle exec rake run_split_accounting_after_close_master >> /var/log/mazer-reports.log')
Jan  4 22:14:01 shopify-inventory-reports CRON[24491]: (root) CMD (echo "crontab can log to reports" >> /var/log/mazer-reports.log)
Jan  4 22:14:04 shopify-inventory-reports CRON[24489]: (CRON) info (No MTA installed, discarding output)
Jan  4 22:15:01 shopify-inventory-reports CRON[24528]: (root) CMD (/bin/bash -l -c 'cd /home/deploy/shopify_pull_and_store && /home/deploy/.rbenv/shims/bundle exec rake run_split_accounting_after_close_master >> /var/log/mazer-reports.log')

Оттуда видно, что cron запускает обе команды каждую минуту (как и должно быть) и не публикует сообщение об ошибке в системном журнале команды, которая, похоже, ничего не делает. Весьма запутанно!

Я использую rails 5, puma и rbenv на Ubuntu 18. Все эти вещи установлены на пользователя sudoer с именем deploy. Ниже вывод ls -l /var/log/mazer-reports.log:

-rw-rw-rw- 1 root root 1543 Jan  4 22:10 mazer-reports.log

Обновление 1/6/2018 : Ромео Нинов указал в комментарии, что я должен рассмотреть переменную среды в shell против cronjob. Конечно же, вывод * * * * * /bin/bash -l -c 'echo $RAILS_ENV' >> /var/log/mazer-reports.log пуст, что означает, что rake не будет знать, какую среду rails запустить из crontab, когда она должна быть производственной. Чтобы попытаться решить эту проблему, я поместил переменную среды в самой команде в crontab следующим образом:

 0 * * * * cd /home/deploy/shopify_pull_and_store && /home/deploy/.rbenv/shims/bundle exec rake RAILS_ENV=production run_split_accounting_after_close_master >> /var/log/mazer-reports.log`

Однако это все еще не решает проблему. Команда все еще не запускается и не входит в указанный файл журнала. Какая-нибудь другая необходимая переменная граблей, о которой я не думаю? Systemd уже запускает puma с секретным приложением и пользователем базы данных и паролем Я никогда не думал, что граблям понадобится такая вещь, но скажите мне, если я ошибаюсь


Обновление 1/7/2018 : Хорошо, ясно, что это проблема переменной среды. Я создал отдельный файл bash с именем «run_accounting», как описано в ответе Ромео, например:

#!/bin/bash
source ~/.bashrc
echo "stuff from run_accounting bash" >> /var/log/mazer-reports.log
env >> /var/log/mazer-reports.log
cd /home/deploy/shopify_pull_and_store && /home/deploy/.rbenv/shims/bundle exec rake run_split_accounting_after_close_master >> /var/log/mazer-reports.log

Теперь вот что странно: если я нажимаю sudo ./run_accounting из терминала, запускается задача rake, и я получаю следующий вывод в моем mazer-reports.log:

stuff from run_accounting bash
SHELL=/bin/bash
TERM=xterm-256color
USER=root
SUDO_USER=deploy
SUDO_UID=1000
USERNAME=root
RACK_ENV=production
MAIL=/var/mail/root
PATH=/home/deploy/.rbenv/shims:/home/deploy/.rbenv/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/snap/bin
SECRET_KEY_BASE=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
PWD=/home/deploy
LANG=en_US.UTF-8
RBENV_SHELL=bash
SHLVL=1
SUDO_COMMAND=./run_accounting
HOME=/home/deploy
RAILS_ENV=production
LOGNAME=root
SHOPIFY_PULL_AND_STORE_DATABASE_USER=shopify_pull_and_store
LESSOPEN=| /usr/bin/lesspipe %s
SHOPIFY_PULL_AND_STORE_DATABASE_PASSWORD=XXXXXXXX
SUDO_GID=1000
LESSCLOSE=/usr/bin/lesspipe %s %s
_=/usr/bin/env
(0.6ms)  SELECT MAX("delayed_jobs"."priority") FROM "delayed_jobs" WHERE "delayed_jobs"."queue" = $1  [["queue", "RunReports"]]
[ActiveJob]    (0.1ms)  BEGIN
[ActiveJob]   SQL (0.9ms)  INSERT INTO "delayed_jobs" ("handler", "run_at", "queue", "created_at", "updated_at") VALUES ($1, $2, $3, $4, $5) RETURNING "id"  
[["handler", "--- !ruby/object:ActiveJob::QueueAdapters::DelayedJobAdapter::JobWrapper\njob_data:\n  job_class: RunReportsSplitMasterJob\n  job_id: 7dfd28bd-a47c-475d-9ccf-5a5d8ef756e7\n  provider_job_id: \n  queue_name: RunReports\n  priority: \n  arguments: []\n  executions: 0\n  locale: en\n"], ["run_at", "2019-01-07 18:02:57.355453"], ["queue", "RunReports"], ["created_at", "2019-01-07 18:02:57.355521"], ["updated_at", "2019-01-07 18:02:57.355521"]]
[ActiveJob]    (0.6ms)  COMMIT
[ActiveJob] Enqueued RunReportsSplitMasterJob (Job ID: 7dfd28bd-a47c-475d-9ccf-5a5d8ef756e7) to DelayedJob(RunReports)

НО, с * * * * * /home/deploy/run_accounting в моем crontab, задача не запускается, и я вижу, что необходимые переменные среды не были загружены, как показано ниже:

stuff from run_accounting bash
SHELL=/bin/sh
PATH=/usr/bin:/bin
PWD=/root
LANG=en_US.UTF-8
SHLVL=1
HOME=/root
LOGNAME=root
_=/usr/bin/env

Почему источник bashrc запускается при запуске сценария bash из терминала, а не при запуске той же команды из crontab?

Ответы [ 2 ]

0 голосов
/ 07 января 2019

Вы можете попытаться объявить переменную окружения перед выпуском комплекта и использовать свой проект bin / bundle:

 0 * * * * cd /home/deploy/shopify_pull_and_store && RAILS_ENV=production bin/bundle exec rake run_split_accounting_after_close_master >> /var/log/mazer-reports.log

Обновление 2019-01-07

Попробуйте установить маршрут к вашему .bashrc следующим образом:

#!/bin/bash
source /home/deploy/.bashrc
echo "stuff from run_accounting bash" >> /var/log/mazer-reports.log
env >> /var/log/mazer-reports.log
cd /home/deploy/shopify_pull_and_store && /home/deploy/.rbenv/shims/bundle exec rake run_split_accounting_after_close_master >> /var/log/mazer-reports.log

или как это:

source ~deploy/.bashrc
0 голосов
/ 07 января 2019

Судя по вашим комментариям, вам нужно установить переменные окружения. Я рекомендую следующий подход: создайте сценарий оболочки, который будет включать вашу команду и исходный файл .bashrc:

#!/bin/bash
. /home/deploy/.bashrc
# can be also
# . /home/deploy/.bash_profile
cd /home/deploy/shopify_pull_and_store && /home/deploy/.rbenv/shims/bundle exec rake run_split_accounting_after_close_master >> /var/log/mazer-reports.log

Вы можете попробовать вместо .bashrc к источнику .bash_profile

И запустите этот скрипт оболочки в cron. Не забудьте сделать этот скрипт исполняемым.

P.S. Может быть, вам нужно добавить также /home/deploy/.bash_profile В общем случае целесообразно добавлять эти файлы из домашней папки пользователя (в данном случае root). Пожалуйста, проверьте в / etc / passwd, где находится дом пользователя root

...