Как создать 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, где будет еще больше полезной информации.