Вопрос или проблема
У меня есть – что я считаю – очень простая задача. Запускать две команды каждые 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
-
Понимание окружения cron: Cron выполняется в ограниченной среде, которая не загружает настройки идентификационного файла вашей оболочки (например,
~/.bashrc
). Вам нужно будет явно указать, как его загрузить. -
Создание исполняемого скрипта:
Вместо того чтобы пытаться запустить функцию непосредственно из~/.bashrc
, создайте отдельный скрипт, напримерchat_login.sh
, и поместите туда необходимые команды и вызовsource
. Таким образом, вы сможете избежать проблем, связанных с ограниченной средой cron.Вот пример, как должен выглядеть ваш скрипт
chat_login.sh
:#!/bin/bash # Загрузка окружения source /root/.bashrc # Вызов вашей функции chat_login
Не забудьте сделать этот скрипт исполняемым:
chmod +x /path/to/chat_login.sh
-
Настройка cronjob:
Теперь, когда у вас есть скрипт, вы можете добавить его в cron. Чтобы отредактировать crontab для текущего пользователя, выполните команду:crontab -e
Затем добавьте следующую строку, чтобы запускать ваш скрипт каждые 10 минут:
*/10 * * * * /path/to/chat_login.sh >> /var/log/cron.log 2>&1
Замените
/path/to/chat_login.sh
на фактический путь к вашему скрипту. -
Проверка логов:
Чтобы убедиться, что cronjob работает должным образом, просматривайте файл логов/var/log/cron.log
, куда вы направили вывод вашего скрипта. Это поможет вам диагностировать любые проблемы, если команда не выполняется как ожидалось.
Дополнительные рекомендации
- Отладка: Если возникнут проблемы с выполнением скрипта, вы можете добавить временные метки и дополнительные сообщения
echo
внутри вашего скрипта для лучшей диагностики. - Переменные окружения: Убедитесь, что все переменные, используемые в вашей функции
chat_login()
и в загружаемом скрипте, правильно определены. Вы можете также экспортировать необходимые переменные окружения в начале вашегоchat_login.sh
.
Заключение
Запуск команд через cron может показаться простым, но важно учитывать, что окружение, обеспечиваемое cron, значительно отличается от того, что обычно используется в интерактивной оболочке. Используя указанные шаги, вы сможете правильно настроить вашу функцию chat_login
и гарантировать ее выполнение каждые 10 минут без проблем.