January 12

Как создать bash-скрипт, который выполняется только из cron

Скрипты Bash — это мощный способ автоматизации задач в системах Linux. Однако, в некоторых случаях может понадобиться, чтобы скрипт выполнялся только при определенных обстоятельствах — например, когда он запускается планировщиком cron, а не вручную. Это может быть полезно для чувствительных скриптов, ручное выполнение которых может вызвать проблемы, или для скриптов, разработанных специально для автоматизированных сред.

В этой статье мы рассмотрим шаги по созданию bash-скрипта, который выполняется только при запуске из cron или когда вручную указан определенный параметр, например --force

1. Понимание требований

Наша цель — создать сценарий, который:

  • По умолчанию запускается только изcron .
  • Позволяет выполнить вручную только при наличии определенного параметра (например, --force).
  • Отклоняет ручное выполнение без дополнительного параметра--force , выводя сообщение, объясняющее ограничение.

Мы сделаем это следующим образом:

  1. Проверка неинтерактивной среды, которая указывает на то, что скрипт выполняется cron.
  2. Добавление проверки параметров для разрешения ручного выполнения с определенным флагом.

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:~ Как создать bash-скрипт, который выполняется только из cron — Teletype ).

Если `$PS1` установлен, это обычно указывает на то, что оболочка является интерактивной (как сеанс терминала). В автоматизированных или неинтерактивных средах, таких как скрипты, запускаемые `cron`, `$PS1` обычно не установлен. Это делает проверку `$PS1` полезной для различения интерактивных и неинтерактивных сред в скриптах.

На этом все! Спасибо за внимание! Если статья была интересна, подпишитесь на телеграм-канал usr_bin, где будет еще больше полезной информации.