Как создать bash-скрипт, который выполняется только из cron
Скрипты Bash — это мощный способ автоматизации задач в системах Linux. Однако, в некоторых случаях может понадобиться, чтобы скрипт выполнялся только при определенных обстоятельствах — например, когда он запускается планировщиком cron, а не вручную. Это может быть полезно для чувствительных скриптов, ручное выполнение которых может вызвать проблемы, или для скриптов, разработанных специально для автоматизированных сред.
В этой статье мы рассмотрим шаги по созданию bash-скрипта, который выполняется только при запуске из cron или когда вручную указан определенный параметр, например --force
1. Понимание требований
Наша цель — создать сценарий, который:
- По умолчанию запускается только из
cron. - Позволяет выполнить вручную только при наличии определенного параметра (например,
--force). - Отклоняет ручное выполнение без дополнительного параметра
--force, выводя сообщение, объясняющее ограничение.
Мы сделаем это следующим образом:
- Проверка неинтерактивной среды, которая указывает на то, что скрипт выполняется
cron. - Добавление проверки параметров для разрешения ручного выполнения с определенным флагом.
2. Создание сценария
Начнем с создания нового bash-скрипта. Назовем его cron_protected_script.sh. Откроем файл с помощью текстового редактора и добавим следующий код:
#!/bin/bash
# Проверка наличия параметра --force
FORCE=false
if [ "$1" == "--force" ]; then
FORCE=true
fi
# Функция для проверки того, запущен ли скрипт из cron
is_running_from_cron() {
[ -z "$PS1" ] && [ -z "$(tty)" ]
}
# Основное условие выполнения
if $FORCE || is_running_from_cron; then
echo "Script is running..."
# Поместите здесь основной код скрипта
else
echo "This script can only be run from cron or with the --force parameter."
exit 1
fiПояснения по коду
- Проверка параметра (
--force) : Скрипт проверяет, передается ли в качестве первого аргумента при выполнени--force. Если--forceприсутствует, он устанавливает переменнуюFORCEвtrue. - Функция для обнаружения
cron:is_running_from_cronФункция проверяет наличие специфических условий. Вcronпеременная$PS1(которая определяет приглашение оболочки) обычно отсутствует, аtty(которая идентифицирует терминал) пуста, поскольку интерактивного терминала нет. Таким образом, функция вернет значение true только в том случае, если скрипт запущен в неинтерактивной среде, напримерcron. - Главное условие выполнения : Скрипт будет запущен, если либо указан параметр
--force, либо скрипт запущен изcron. В противном случае он выводит сообщение об ошибке и завершает работу.
3. Добавление скрипта в cron
Чтобы запланировать выполнение скрипта с помощью cron, выполните следующие действия:
1. Сделайте скрипт исполняемым : Сначала сохраните файл и дайте ему права на исполнение:
chmod +x /path/to/cron_protected_script.sh
2. Отрредактируйте crontab: откройте crontab для редактирования:
crontab -e
3. Добавьте запись сron : запланируйте сценарий, добавив строку в crontab. Например, чтобы запускать сценарий ежедневно в полночь:
0 0 * * * /path/to/cron_protected_script.sh
4. Тестирование сценария
После настройки скрипта необходимо протестировать как сценарий выполнения через cron, так и сценарий ручного выполнения.
1. Ручное выполнение без--force : Попробуйте запустить скрипт без параметров:
/path/to/cron_protected_script.sh
Вы должны увидеть следующий вывод:
This script can only be run from cron or with the --force parameter.
2. Ручное выполнение с помощью--force : Теперь попробуйте запустить скрипт с параметром --force:
/path/to/cron_protected_script.sh --force
На этот раз скрипт должен выполниться нормально и вывести сообщение:
Script is running...
Автоматическое выполнение через сron: дождитесь запланированного времени или вручную запустите задание cron, чтобы убедиться, что скрипт успешно выполняется в cron. Вы можете проверить системные журналы (обычно в /var/log/syslog) для подтверждения того, что задание, как и ожидалось.
Ключевые моменты:
Эта техника полезна для скриптов, которые должны строго контролироваться и запускаться только при определенных условиях. Объединяя проверки параметров и проверку среды, вы можете создавать безопасные, автоматизированные рабочие процессы, соответствующие вашим потребностям.
5. Бонус
teletype
Переменная `tty` (сокращение от «teletype») в Unix-подобных системах относится к терминалу, связанному с процессом. Когда вы запускаете команду `tty` в терминале, она выводит путь к файлу терминального устройства (например, `/dev/tty1`), показывая, что сеанс имеет интерактивный терминал.
В скриптах проверка `tty` — это способ определить, был ли скрипт запущен в интерактивном сеансе или автоматизированным процессом, таким как `cron`. Поскольку задания `cron` выполняются без подключенного терминала, `tty` вернет пустой результат, когда скрипт запускается `cron`, что делает его полезным для обнаружения неинтерактивных сред.
$PS1
Переменная `$PS1` в Unix-подобных системах определяет основную строку приглашения в интерактивной оболочке. Она управляет тем, что вы видите в качестве командной строки (например, `user@host:~
Если `$PS1` установлен, это обычно указывает на то, что оболочка является интерактивной (как сеанс терминала). В автоматизированных или неинтерактивных средах, таких как скрипты, запускаемые `cron`, `$PS1` обычно не установлен. Это делает проверку `$PS1` полезной для различения интерактивных и неинтерактивных сред в скриптах.
На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.