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

Ручные операции с crontab подвержены ошибкам: опечатки, потеря последовательности, забытые резервные копии. В этой статье показано, как создать и запустить Shell-скрипты для добавления и удаления Cronjob на Ubuntu EC2-инстансе в AWS. Скрипты выполняются с локальной машины и подключаются по SSH к инстансу, где переключаются на root для работы с crontab.
Важно: пользователь, от имени которого вы подключаетесь по SSH, должен иметь sudo-доступ.
Предварительные требования
- Базовое понимание Shell-скриптов и Cronjob.
- AWS-аккаунт и запущенный EC2-инстанс.
- Локальная машина с доступом к .pem ключу для SSH и установленным ssh.
- Пользователь EC2 с sudo-привилегиями.
Что мы сделаем
- Создадим Shell-скрипт для добавления Cronjob.
- Запустим скрипт и проверим добавление.
- Создадим Shell-скрипт для удаления Cronjob.
- Запустим скрипт и проверим удаление.
Скрипт для добавления Cronjob
Создайте файл на локальной машине и вставьте следующий код (оригинал доступен в репозитории GitHub по ссылке в коде).
Github Link: https://github.com/shivalkarrahul/DevOps/blob/master/aws/shell-scripts/aws-ec2-add-remove-cron-job/add-cronjob.shFile: 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"
Проверка на инстансе:
ssh -i ~/Downloads/howtoforge-test.pem ubuntu@ec2-15-236-64-128.eu-west-3.compute.amazonaws.comsudo -icrontab -lcat /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.shFile: 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
Повторный запуск с тем же ключом покажет обновлённый список:
./remove-cronjob.sh -K ~/Downloads/howtoforge-test.pem -U ubuntu -I ec2-15-236-64-128.eu-west-3.compute.amazonaws.com -l yes
С проверкой напрямую на инстансе:
ssh -i ~/Downloads/howtoforge-test.pem ubuntu@ec2-15-236-64-128.eu-west-3.compute.amazonaws.comsudo -icrontab -l
Рекомендации по безопасности и операционные заметки
- Всегда делайте резервную копию текущего 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
- Получить актуальный crontab: crontab -l > crontab.current
- Сохранить резервную копию с меткой времени или в репозиторий.
- Применить изменения через временный файл и проверить синтаксис.
- Проверить логи выполнения и убедиться, что задания запускаются.
- При необходимости откат: 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 для централизованного управления.
Похожие материалы
Несколько аккаунтов Skype: Multi Skype Launcher
Журнал для работы: повысить продуктивность
Персональные звуки уведомлений на Android
Скачивание шоу Hulu для офлайн‑просмотра
Microsoft Start: персонализированная новостная лента