Как правильно использовать source в cronjob?

Вопрос или проблема

У меня есть – что я считаю – очень простая задача. Запускать две команды каждые 10 минут.

Сначала я написал эту функцию в ~/.bashrc:

chat_login() {
    echo "Выполняются команды в $(date)"
    command1 --role some-role --servername some_server
    source $SOME_PATH/sourceme
    echo "Команды завершены в $(date)"
}

Обратите внимание, что я не смог поместить это в скрипт chat_login.sh, потому что при запуске bash /chat_login.sh команда source не оказывала эффекта. Я обнаружил, что единственный способ заставить команду source работать – это разместить ее как функцию в ~/.bashrc.

Теперь все, что я хочу сделать, это запускать chat_login каждые 10 минут. Это работает в терминале, но не срабатывает, как только я пытаюсь сделать это с помощью cron, с "chat_login: команда не найдена".

Это настройка cron, которую я пробовал. Я уже пытался поиграть с различными экспортами, такими как PATH и BASH_ENV, и загружал файл ~/.bashrc, но не могу заставить это работать.

echo "SHELL=/bin/bash"; echo BASH_ENV="/root/.bashrc"; echo "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"; echo "*/1 * * * * . ~/.bashrc && chat_login >> /var/log/cron.log 2>&1"

Ответ или решение

Использование команды source в cronjob требует внимательного подхода, поскольку окружение, в котором работает cron, отличается от интерактивной оболочки. Вы хотите запускать функцию chat_login из вашего файла ~/.bashrc, но cron не запускает этот файл автоматически. В этом ответе мы рассмотрим, как правильно настроить cron для запуска вашей функции, содержащей source.

Шаги для настройки cronjob

  1. Понимание окружения cron: Cron выполняется в ограниченной среде, которая не загружает настройки идентификационного файла вашей оболочки (например, ~/.bashrc). Вам нужно будет явно указать, как его загрузить.

  2. Создание исполняемого скрипта:
    Вместо того чтобы пытаться запустить функцию непосредственно из ~/.bashrc, создайте отдельный скрипт, например chat_login.sh, и поместите туда необходимые команды и вызов source. Таким образом, вы сможете избежать проблем, связанных с ограниченной средой cron.

    Вот пример, как должен выглядеть ваш скрипт chat_login.sh:

    #!/bin/bash
    
    # Загрузка окружения
    source /root/.bashrc
    
    # Вызов вашей функции
    chat_login

    Не забудьте сделать этот скрипт исполняемым:

    chmod +x /path/to/chat_login.sh
  3. Настройка cronjob:
    Теперь, когда у вас есть скрипт, вы можете добавить его в cron. Чтобы отредактировать crontab для текущего пользователя, выполните команду:

    crontab -e

    Затем добавьте следующую строку, чтобы запускать ваш скрипт каждые 10 минут:

    */10 * * * * /path/to/chat_login.sh >> /var/log/cron.log 2>&1

    Замените /path/to/chat_login.sh на фактический путь к вашему скрипту.

  4. Проверка логов:
    Чтобы убедиться, что cronjob работает должным образом, просматривайте файл логов /var/log/cron.log, куда вы направили вывод вашего скрипта. Это поможет вам диагностировать любые проблемы, если команда не выполняется как ожидалось.

Дополнительные рекомендации

  • Отладка: Если возникнут проблемы с выполнением скрипта, вы можете добавить временные метки и дополнительные сообщения echo внутри вашего скрипта для лучшей диагностики.
  • Переменные окружения: Убедитесь, что все переменные, используемые в вашей функции chat_login() и в загружаемом скрипте, правильно определены. Вы можете также экспортировать необходимые переменные окружения в начале вашего chat_login.sh.

Заключение

Запуск команд через cron может показаться простым, но важно учитывать, что окружение, обеспечиваемое cron, значительно отличается от того, что обычно используется в интерактивной оболочке. Используя указанные шаги, вы сможете правильно настроить вашу функцию chat_login и гарантировать ее выполнение каждые 10 минут без проблем.

Оцените материал
Добавить комментарий

Капча загружается...