Гид по технологиям

Автоматизация добавления и удаления Cronjob на Ubuntu EC2 с помощью Shell-скриптов

• 5 min read • DevOps • Обновлено 24 Nov 2025
Shell: Добавление и удаление cron на Ubuntu EC2
Shell: Добавление и удаление cron на Ubuntu EC2

Кратко: два простых Shell-скрипта позволяют автоматически добавлять и удалять Cronjob на Ubuntu EC2 через SSH, избегая рутинных ошибок и экономя время. Требуется локальная машина с доступом к .pem-ключу и пользователь EC2 с sudo-привилегиями.

Введение

Схема автоматизации Cronjob на EC2

Ручные операции с crontab подвержены ошибкам: опечатки, потеря последовательности, забытые резервные копии. В этой статье показано, как создать и запустить Shell-скрипты для добавления и удаления Cronjob на Ubuntu EC2-инстансе в AWS. Скрипты выполняются с локальной машины и подключаются по SSH к инстансу, где переключаются на root для работы с crontab.

Важно: пользователь, от имени которого вы подключаетесь по SSH, должен иметь sudo-доступ.

Предварительные требования

  • Базовое понимание Shell-скриптов и Cronjob.
  • AWS-аккаунт и запущенный EC2-инстанс.
  • Локальная машина с доступом к .pem ключу для SSH и установленным ssh.
  • Пользователь EC2 с sudo-привилегиями.

Что мы сделаем

  1. Создадим Shell-скрипт для добавления Cronjob.
  2. Запустим скрипт и проверим добавление.
  3. Создадим Shell-скрипт для удаления Cronjob.
  4. Запустим скрипт и проверим удаление.

Скрипт для добавления Cronjob

Создайте файл на локальной машине и вставьте следующий код (оригинал доступен в репозитории GitHub по ссылке в коде).

Github Link: https://github.com/shivalkarrahul/DevOps/blob/master/aws/shell-scripts/aws-ec2-add-remove-cron-job/add-cronjob.sh
File: add-cronjob.sh
#!/bin/bash

helpFunction()
{ 
    echo ""
    printf "\033[1;32mUsage: $0 -K  -U  -I  -a "
    echo ""
    echo -e "\t-K \".pem key of the server on which a cron job has to be added\""
    echo -e "\t-U UserName of the server on which a cron job has to be added"
    echo -e "\t-I IP of the server on which a cron job has to be added"
    echo -e "\t-a Name of the cron to be added (in double quotes)"
    echo "Add a new Cron Job"
    echo "e.g."
    echo "./add-cronjob.sh -K /Users/cloudcover/Documents/Rahul/access/rahuls.pem -U ubuntu -I ec2-35-180-234-158.eu-west-3.compute.amazonaws.com -a \"0 5 * * 1  testCronJob\""

    echo -e "\033[0m" #reset color
    exit 1 # Exit script after printing help
}

while getopts "I:K:U:a:" opt
do
    case "$opt" in
        K ) internalServerPemKey="$OPTARG" ;;
        U ) internalServerUser="$OPTARG" ;; 
        I ) internalServerIP="$OPTARG" ;;
        a ) addCron="$OPTARG" ;;
        ? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
    esac
done

echo  "******************"
#echo $listCronJobs
# Print helpFunction in case parameters are empty
if [ -z "$internalServerIP" ] || [ -z "$internalServerPemKey" ] || [ -z "$internalServerUser" ] || [ -z "$addCron" ]
then
    printf "\033[1;31m"
    echo "Some or all of the parameters are empty";
    helpFunction
fi

# Begin script in case all parameters are correct
printf "\033[1;33m------------------------------------------------------------------Before ssh"
echo -e "\033[0m" #reset color
echo ".pem key of the server on which a new user has be created\t\t: \t$internalServerPemKey"
echo "UserName of the server on which a new user has be created\t\t: \t$internalServerUser"
echo "IP of the server on which a new user has be created\t\t\t:\t$internalServerIP"
echo "Name of the cron to be added\t\t\t\t:\t$addCron"


printf "\033[1;31mLogging into: "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"

ssh -i "$internalServerPemKey" "$internalServerUser"@"$internalServerIP" << HERE
printf "\033[1;33m------------------------------------------------------------------After ssh"
echo -e "\033[0m" #reset color
#echo "Executing connect_prod_cron_new.sh"
#sh connect_prod_cron_new.sh
#sleep 2
echo "after ssh"
echo "IP Of the Server:" 
hostname -I
echo "Hostname of the Server:"
hostname
echo "Changing user to root"
    sudo su <><> EOF
    echo "User Switched To;"
    whoami
    printf "\033[1;33m------------------------------------------------------------------List of Cron Jobs Before Addition"
    echo -e "\033[0m" #reset color
    crontab -l | cat -n
    if [ -n "$addCron" ]
    then
        echo "Inside addCron"
        crontab -l >crontab.tmp
        printf '%s\n' "$addCron" >>crontab.tmp
        crontab crontab.tmp && rm -f crontab.tmp
    fi
    printf "\033[1;33m------------------------------------------------------------------Updated List of Cron Jobs"
    echo -e "\033[0m" #reset color
    crontab -l | cat -n
    printf "\033[1;31mExiting from         ---> "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
    #echo "Existing user\t---> $userName"
EOF
HERE

Перед созданием нового Cronjob рекомендуется проверить, есть ли уже задания на инстансе.

Пример подключения по SSH на EC2:

ssh -i ~/Downloads/howtoforge-test.pem ubuntu@ec2-15-236-64-128.eu-west-3.compute.amazonaws.com

Список Cronjob:

crontab -l

Запуск скрипта добавления Cronjob

С локальной машины выполните команду (пример для Ubuntu 18.04 EC2). Скрипт добавит задание, выполняющееся каждую минуту и записывающее дату в /tmp/cron_output. Подкорректируйте cron-строку по необходимости.

./add-cronjob.sh -K ~/Downloads/howtoforge-test.pem -U ubuntu -I ec2-15-236-64-128.eu-west-3.compute.amazonaws.com -a "* * * * * /bin/date >> /tmp/cron_output"

Скриншот добавления Cronjob

Проверка на инстансе:

ssh -i ~/Downloads/howtoforge-test.pem ubuntu@ec2-15-236-64-128.eu-west-3.compute.amazonaws.com
sudo -i
crontab -l
cat /tmp/cron_output

Результат выполнения Cronjob — файл /tmp/cron_output

Скрипт для удаления Cronjob

Если нужно удалить ранее добавленный Cronjob, используйте второй скрипт. Он выведет список задач и позволит удалить выбранную строку по номеру.

Github Link: https://github.com/shivalkarrahul/DevOps/blob/master/aws/shell-scripts/aws-ec2-add-remove-cron-job/remove-cronjob.sh
File: remove-cronjob.sh
#!/bin/bash

helpFunction()
{ 
    echo ""
    printf "\033[1;32mUsage: $0 -K  -U  -I  -l "
    echo ""
    echo -e "\t-K \".pem key of the server on which a cron job has to be removed\""
    echo -e "\t-U UserName of the server on which a cron job has to be removed"
    echo -e "\t-I IP of the server on which a cron job has to be removed"
    echo -e "\t-l List the existing Cron Jobs, provide \"yes\" as a parameter. Get a list first and then specify job no which needs to be removed"
    echo -e  "e.g."
    echo "Remove a new Cron Job"
    echo "./remove-cronjob.sh -K /Users/cloudcover/Documents/Rahul/access/rahuls.pem -U ubuntu -I ec2-52-47-90-247.eu-west-3.compute.amazonaws.com -l yes"
    echo -e "\033[0m" #reset color
    exit 1 # Exit script after printing help
}

while getopts "I:K:U:l:" opt
do
    case "$opt" in
    K ) internalServerPemKey="$OPTARG" ;;
    U ) internalServerUser="$OPTARG" ;; 
    I ) internalServerIP="$OPTARG" ;;
    l ) showListOfJobs="$OPTARG" ;;
    ? ) helpFunction ;; # Print helpFunction in case parameter is non-existent
    esac
done

echo  "******************"
echo $listCronJobs

# Print helpFunction in case parameters are empty
if [ -z "$internalServerIP" ] || [ -z "$internalServerPemKey" ] || [ -z "$internalServerUser" ] || [ -z "$showListOfJobs" ]
then
    printf "\033[1;31m"

    echo "Some or all of the parameters are empty";
    helpFunction
fi

# Begin script in case all parameters are correct
printf "\033[1;33m------------------------------------------------------------------Before ssh"
echo -e "\033[0m" #reset color
echo ".pem key of the server on which a new user has be created\t\t: \t$internalServerPemKey"
echo "UserName of the server on which a new user has be created\t\t: \t$internalServerUser"
echo "IP of the server on which a new user has be created\t\t\t:\t$internalServerIP"

if [ $showListOfJobs == "yes" ]
then

    printf "\033[1;31mLogging into: "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
    ssh -i "$internalServerPemKey" "$internalServerUser"@"$internalServerIP" << HERE
        printf "\033[1;33m------------------------------------------------------------------After ssh"
        echo -e "\033[0m" #reset color
        echo "after ssh"
        hostname -I
        hostname
        echo "Changing user to root"
        sudo su << EOF
            echo "User Switched To;"
            whoami
            printf "\033[1;33m------------------------------------------------------------------List of Cron Jobs Before Deletion"
            echo -e "\033[0m" #reset color
            crontab -l | cat -n
            printf "\033[1;31mExiting from         ---> "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
EOF
HERE
fi


echo "Enter Cron Job Line Number to be removed"
read lineNumber
printf "\033[1;31mLogging into: "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
ssh -i "$internalServerPemKey" "$internalServerUser"@"$internalServerIP" << HERE
    printf "\033[1;33m------------------------------------------------------------------After ssh"
    echo -e "\033[0m" #reset color
    echo "after ssh"
    hostname -I
    hostname
    #sleep 2
    echo "Changing user to root"
    sudo su << EOF
        echo "User Switched To;"
        whoami
        printf "\033[1;33m------------------------------------------------------------------List of Cron Jobs Before Deletion"
        echo -e "\033[0m" #reset color
        crontab -l | cat -n
        crontab -l | sed -e "$lineNumber"d >crontab.tmp
        crontab crontab.tmp && rm -f crontab.tmp
        printf "\033[1;33m------------------------------------------------------------------Updated List of Cron Jobs"
        echo -e "\033[0m" #reset color
        crontab -l | cat -n
        printf "\033[1;31mExiting from         ---> "$internalServerPemKey" "$internalServerUser"@"$internalServerIP"\033[0m\n"
EOF
HERE

Запуск скрипта удаления Cronjob

Запустите скрипт, чтобы получить список задач и удалить выбранную по номеру строку.

./remove-cronjob.sh -K ~/Downloads/howtoforge-test.pem -U ubuntu -I ec2-15-236-64-128.eu-west-3.compute.amazonaws.com -l yes

Скриншот удаления Cronjob

Повторный запуск с тем же ключом покажет обновлённый список:

./remove-cronjob.sh -K ~/Downloads/howtoforge-test.pem -U ubuntu -I ec2-15-236-64-128.eu-west-3.compute.amazonaws.com -l yes

Список Cronjob после удаления

С проверкой напрямую на инстансе:

ssh -i ~/Downloads/howtoforge-test.pem ubuntu@ec2-15-236-64-128.eu-west-3.compute.amazonaws.com
sudo -i
crontab -l

Список Cronjob на инстансе

Рекомендации по безопасности и операционные заметки

  • Всегда делайте резервную копию текущего crontab перед изменением: crontab -l > crontab.bak
  • Используйте ограниченные права доступа к .pem-файлу (600) и храните ключи безопасно.
  • По возможности используйте утилиты централизованного управления (Ansible, SSM) для массовых правок вместо прямых SSH-скриптов.
  • Логируйте изменения crontab и храните историю (например, в Git или в S3) для аудита.

Когда этот подход не подходит (примеры)

  • Если инфраструктура масштабируется автоматически и вам нужно массово управлять заданиями на сотнях инстансов — лучше использовать конфигурационное управление (Ansible) или AWS Systems Manager.
  • Если требуется высокая точность запуска и трассировка — рассмотрите systemd timers вместо cron.
  • Если задания должны выполняться в контейнерах, используйте совпадающие механизмы планирования внутри контейнера.

Альтернативные подходы

  • AWS Systems Manager (SSM Run Command) для удалённого запуска команд без прямого SSH.
  • Ansible playbooks для идемпотентного управления crontab.
  • Хранение crontab в репозитории и развёртывание через CI/CD.
  • systemd timers как более гибкая замена cron в современных системах.

Мини-методология безопасного изменения crontab

  1. Получить актуальный crontab: crontab -l > crontab.current
  2. Сохранить резервную копию с меткой времени или в репозиторий.
  3. Применить изменения через временный файл и проверить синтаксис.
  4. Проверить логи выполнения и убедиться, что задания запускаются.
  5. При необходимости откат: crontab crontab.current

Чек-листы по ролям

  • DevOps-инженер:

    • Проверить доступы SSH и sudo.
    • Создать резервную копию crontab.
    • Выполнить скрипт и проверить логи.
  • Системный администратор:

    • Подтвердить требуемую cron-строку и окружение (PATH, переменные).
    • Проверить права на скрипты, которые запускаются cron.
  • Аудитор:

    • Убедиться, что изменения зафиксированы в журнале и доступны для ревью.

Шаблоны и быстрые команды (cheat sheet)

  • Сохранить текущий crontab:
crontab -l > crontab.bak
  • Восстановить crontab из файла:
crontab crontab.bak
  • Показать crontab с нумерацией строк:
crontab -l | cat -n
  • Удалить строку №N (локально):
crontab -l | sed -e "Nd" >crontab.tmp && crontab crontab.tmp && rm -f crontab.tmp

(где N — номер строки)

Матрица рисков и смягчающие меры

  • Неправильная cron-строка — риск: задание не выполнится; смягчение: тестовый запуск команды вручную.
  • Потеря crontab — риск: прерывание задач; смягчение: всегда резервировать перед изменением.
  • Утечка .pem-ключа — риск: несанкционированный доступ; смягчение: ротация ключей, хранение в менеджере секретов.

Однострочный глоссарий

  • Cronjob — правило для планировщика cron, описывающее расписание и команду.
  • crontab — таблица cron для конкретного пользователя; команда для её редактирования.
  • EC2 — виртуальная машина в AWS.
  • .pem — приватный ключ для аутентификации SSH.

Отладка и типичные ошибки

  • “no crontab for user” — значит текущий crontab пуст.
  • Ошибки в PATH — команды в cron не выполняются; указывайте абсолютные пути или задавайте PATH в crontab.
  • Права на скрипт — убедитесь, что файл исполняемый (chmod +x).

Краткое резюме

Скрипты add-cronjob.sh и remove-cronjob.sh позволяют безопасно автоматизировать рутинные операции с crontab на Ubuntu EC2 через SSH. Подготовьте резервные копии, логируйте изменения и по возможности переходите к централизованным инструментам управления, если нужен масштаб.

Заключение

Автоматизация добавления и удаления Cronjob уменьшает риск человеческой ошибки и упрощает управление задачами на отдельных EC2-инстансах. Для одиночных или небольших наборов инстансов предложенные скрипты удобны; при большем масштабе рассмотрите SSM или Ansible для централизованного управления.

Поделиться: X/Twitter Facebook LinkedIn Telegram
Автор
Редакция

Похожие материалы

Несколько аккаунтов Skype: Multi Skype Launcher
Программное обеспечение

Несколько аккаунтов Skype: Multi Skype Launcher

Журнал для работы: повысить продуктивность
Productivity

Журнал для работы: повысить продуктивность

Персональные звуки уведомлений на Android
Android.

Персональные звуки уведомлений на Android

Скачивание шоу Hulu для офлайн‑просмотра
Стриминг

Скачивание шоу Hulu для офлайн‑просмотра

Microsoft Start: персонализированная новостная лента
Новости

Microsoft Start: персонализированная новостная лента

Как изменить имя в Epic Games быстро
Гайды

Как изменить имя в Epic Games быстро