Как запустить задание cron для дайджеста уведомлений edX

Я пытаюсь написать сценарий bash, который будет запускаться ежедневным заданием cron от имени определенного пользователя («уведомитель»).

  1. Запись в crontab и скрипт bash

    crontab -u notifier -e
    
    53 09 * * * /edx/app/notifier/not.sh
    

    Содержимое скрипта, который я разместил в домашнем каталоге моего пользователя («notifier»), выглядит следующим образом:

    #!/bin/bash
    SHELL=/bin/bash
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin
    
    cd "$(dirname "$0")"
    DATE=`date +%Y-%m-%d -d "tomorrow"`
    
    /edx/app/notifier/virtualenvs/notifier/bin/python /edx/app/notifier/src/manage.py forums_digest --to_datetime=$DATE
    

    Однако это не работает должным образом.

  2. Ниже приведены отдельные шаги, которые я успешно выполняю вручную.

    sudo -H -u notifier bash
    cd
    DATE=`date +%Y-%m-%d -d "tomorrow"`
    /edx/app/notifier/virtualenvs/notifier/bin/python /edx/app/notifier/src/manage.py forums_digest --to_datetime=$DATE
    

Как я могу запустить дайджест уведомлений как задание cron?


person n00bFox    schedule 16.07.2018    source источник
comment
Вы получаете сообщения об ошибках? Действительно ли /edx/app является домашним каталогом этого пользователя? Вы пытаетесь использовать virtualenv без запуска его сценария activate (или вы используете нестандартный venv, который не требует его)? И наоборот, работают ли ваши ручные шаги после того, как вы deactivate (или что-то еще)?   -  person tripleee    schedule 16.07.2018
comment
В любом случае, это больше похоже на вопрос Python, чем на вопрос Bash или вопрос Cron.   -  person tripleee    schedule 16.07.2018
comment
Это похоже на проблему с каталогом. В последние несколько дней я много экспериментировал. Я могу выполнить шаги вручную следующим образом (обратите внимание, что я не активирую venv явно) sudo -H -u notifier bash cd /edx/app/notifier/virtualenvs/notifier/bin/python /edx/app/notifier/src/ manage.py forums_digest --to_datetime=2018-07-08   -  person n00bFox    schedule 16.07.2018
comment
Как видите, публиковать код в комментариях просто бесполезно. Пожалуйста, отредактируйте свой вопрос, чтобы предоставить дополнительную информацию или диагностику.   -  person tripleee    schedule 16.07.2018
comment
Если я явно устанавливаю home/cd $(dirname /edx/app/notifier), то все работает правильно, за исключением того, что я получаю сообщение об ошибке sqlite3.OperationalError: невозможно открыть файл базы данных nofitier.db. Очевидно, он не может найти файл базы данных, который находится в папка /edx/app/notifier/db   -  person n00bFox    schedule 16.07.2018
comment
Если env был активен, когда вы запускали sudo, некоторые настройки из него все еще могли быть активны. Еще раз, пожалуйста, уточните свой вопрос, добавив недостающие детали; и если вы не activate env, когда должны, вы против этого как какой-то принцип, или вам просто не приходило в голову попытаться activate внутри скрипта?   -  person tripleee    schedule 16.07.2018
comment
извините, это мой первый пост на Stackoverflow, пока нет прав на редактирование постов. В любом случае, спасибо за ответ.   -  person n00bFox    schedule 16.07.2018
comment
явная активация источника env cd $(dirname /edx/app/notifier) ​​notifier_env source /edx/app/notifier/bin/activate также не помогает, я получаю ту же ошибку.   -  person n00bFox    schedule 16.07.2018
comment
Ты был прав в три раза. Большое спасибо. Теперь это работает из crontab пользовательского 'notifier' 'code'#!/bin/bash source /edx/app/notifier/notifier_env cd /edx/app/notifier/src export LANG=en_US.UTF-8 DATE=date +%Y-%m-%d -d "tomorrow" /edx/app/notifier/virtualenvs/notifier/bin/python manage.py forums_digest --to_datetime=$DATE 'код'   -  person n00bFox    schedule 17.07.2018
comment
Возможно, вы захотите опубликовать собственный ответ, объясняющий, где вы ошиблись и как вы это поняли. Публикация и, в конечном итоге, принятие вашего собственного ответа - это нормально. Хотя в его нынешнем виде это вряд ли поможет будущим посетителям, потому что слишком много деталей размыто или отсутствует.   -  person tripleee    schedule 17.07.2018


Ответы (1)


Этот ответ, по сути, принадлежит пользователю tripleee (см. его ответы в комментариях выше). Действительно, как он и предполагал, мне нужно было активировать venv перед запуском скрипта. Я просто предоставляю завершенные шаги, основанные на его идее, которые помогли мне решить эту проблему. 1. Это то, что я помещаю в crontab, если пользовательский «уведомитель»

55 13 * * * /edx/app/notifier/not.sh >/dev/null 2>&1

2. А ниже содержимое файла скрипта not.sh, который я создал в /edx/app/notifier

#!/bin/bash
source /edx/app/notifier/notifier_env
cd /edx/app/notifier/src
export LANG=en_US.UTF-8
DATE=`date +%Y-%m-%d -d "tomorrow"`
/edx/app/notifier/virtualenvs/notifier/bin/python manage.py forums_digest --to_datetime=$DATE
person n00bFox    schedule 17.07.2018
comment
Я считаю, что теперь вы сможете принять этот ответ и, таким образом, отметить этот вопрос как решенный. См. также справку. - person tripleee; 21.07.2018