Автоматизация Bash скриптов на Linux имеет важное значение для задач системного администрирования, таких как установка приложений и мониторинг системных журналов. Cron - это планировщик рабочих мест, который выполняет задачи с определенными интервалами, в то время как systemd служит менеджером служб, обрабатывая приложения через профили служб в Linux.

В этой статье объясняется, как автоматизировать Bash скрипты на Linux с использованием Cron и Systemd для автоматического выполнения и управления системными задачами.

Предпосылки

  • Ubuntu 24.04 VPS.
  • Доступ к корню SSH или пользователь с привилегиями sudo.
  • Установите стек LAMP.

Конвенции

1
2
# - данные команды должны выполняться с правами root либо непосредственно от имени пользователя root, либо с помощью команды sudo.
$ - данные команды должны выполняться от имени обычного пользователя

Использование Bash Alias в сценарии Bash

Вы можете использовать псевдонимы Bash в сценариях для сокращения длинных команд и обеспечения возможности повторного использования кода с другими функциями Bash, такими как условные заявления и циклы. Следуйте приведенным ниже шагам, чтобы использовать псевдонимы в сценарии Bash для проверки и выполнения конкретных задач.

Создайте скрипт Advanced-alias.sh.

1
$ nano advanced-alias.sh

Добавьте следующее содержимое в файл Advanced-alias.sh.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#!/bin/bash

shopt -s expand_aliases

alias sysinfo='uname -a && lscpu && free -h'
alias lamp='sudo apt update && sudo apt install apache mysql php'
alias lemp='sudo apt update && sudo apt install nginx mysql php'
alias mean='sudo apt update && sudo apt install -y mongodb npm && sudo npm install -g @angular/cli && sudo npm'

echo "Select an option:"
echo "1. Show System Information"
echo "2. Install LAMP"
echo "3. Install LEMP"
echo "4. Install MEAN"
read -p "Enter your selection (1-4): " selection

if [ "$selection" -eq 1 ]; then
    echo -e "\nGathering system information..."
    sysinfo

elif [ "$selection" -eq 2 ]; then
    echo -e "\n Installing the LAMP Stack"
    lamp

elif [ "$selection" -eq 3 ]; then
    echo -e "\n Installing LEMP"
    lemp

elif [ "$selection" -eq 4 ]; then
    echo -e "\nInstalling MEAN:"
    mean

else
    echo "Invalid selection. Please select a valid option."
    exit 1
fi

Сохраните и закройте файл.

Команда shopt -s expand_aliases в вышеупомянутом скрипте позволяет расширять псевдонимы, в то время как псевдонимы lamp, lemp и mean Bash сокращают полные команды установки для установки конкретных приложений. Переменная выбора хранит пользовательский ввод и использует условное утверждение if-elif для запуска команд псевдонима Bash.

Запустите сценарий с помощью Bash.

1
$ bash advanced-alias.sh

Введите выбор, такой как 2, чтобы запустить команду alias lamp.

1
2
3
4
5
6
Select an option:
1. Show System Information
2. Install LAMP
3. Install LEMP
4. Install MEAN
Enter your selection (1-4): 2

Результат:

1
2
Installing the LAMP Stack
.................................

Создание сценариев Bash

Bash скрипты поддерживают несколько команд и функций, которые определяют, как задачи выполняются в системе. Следуйте шагам ниже, чтобы создать новые скрипты Bash для резервного копирования критических файлов веб-приложений и мониторинга системных журналов для ошибок.

Переключитесь на домашний каталог вашего пользователя.

1
$ cd

Создайте новый скрипт log-monitor.sh.

1
$ nano log-monitor.sh

Добавьте следующее содержимое в файл log-monitor.sh.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
#!/bin/bash

LOG_FILE="/var/log/syslog" 
ERROR_LOG="/opt/data/error_log.txt"
WARNING_LOG="/opt/data/warning_log.txt"

tail -F "$LOG_FILE" | while read line; do
    if echo "$line" | grep -q "error"; then
        echo "$line" >> "$ERROR_LOG"
    elif echo "$line" | grep -q "warning"; then
        echo "$line" >> "$WARNING_LOG"
    fi
done

Сохраните и закройте файл.

Приведенный выше скрипт Bash создает файлы error_log.txt и warning_log.txt в каталоге /opt/data для хранения отфильтрованного результата из файла журналов системы /var/log/syslog с использованием временной петли. Сценарий фильтрует результат и записывает его в соответствующий файл ошибок или предупреждений каждый раз, когда новая ошибка отображается в файле /var/log/syslog.

Создайте новый скрипт backup.sh.

1
$ nano backup.sh

Добавьте в файл следующее содержимое.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash

DB_USER="user"
DB_PASSWORD="new-password"
DB_NAME="mysql"

DB_BACKUP_DIR="mysql_backup"
WEB_FILES_DIR="web_backup"

mkdir -p "$DB_BACKUP_DIR"
mkdir -p "$WEB_FILES_DIR"

DATE=$(date +"%Y%m%d_%H%M%S")

mysqldump -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$DB_BACKUP_DIR/db_backup_$DATE.sql"
echo "MySQL backup completed: $DB_BACKUP_DIR/db_backup_$DATE.sql"

tar -czf "$WEB_FILES_DIR/web_backup_$DATE.tar.gz" /var/www/html
echo "Web application backup completed: $WEB_FILES_DIR/web_backup_$DATE.tar.gz"

Сохраните и закройте файл.

Приведенный выше скрипт Bash подключается к серверу базы данных MySQL с использованием переменных DB_... Затем скрипт создает каталоги mysql_backup и web_backup для хранения резервных копий базы данных и веб-приложений.

Переместите скрипт Bash в общесистемный каталог, такой как /opt.

1
$ sudo cp backup.sh log-monitor.sh /opt/

Создайте новый каталог данных в выбранном вами общесистемном каталоге.

1
$ sudo mkdir -p /opt/data

Измените разрешение каталога на 777, чтобы все пользователи могли писать файлы.

1
$ sudo chmod 777 /opt/data

Автоматизация Bash Script на Linux с помощью Cron

Cron создает рабочие места, которые вы можете использовать для планирования и автоматического запуска скрипта Bash через определенные промежутки времени. Выполните следующие действия, чтобы автоматизировать скрипты Bash, созданные ранее, для автоматического резервного копирования базы данных MySQL и файлов веб-приложений ежедневно.

Откройте редактор Crontab.

1
$ crontab -e

Выберите нужный текстовый редактор для редактирования файла Crontab по запросу. Например, выберите 1 для выбора текстового редактора nano.

В конце файла добавить следующую директиву.

1
0 2 * * * /opt/backup.sh

Сохраните и закройте файл.

Вышеупомянутая работа cron запускает скрипт backup.sh ежедневно в 2:00 утра для резервного копирования базы данных и файлов веб-приложений. В вышеупомянутой работе cron:

  • 0: Запускает сценарий в начале минуты. Установите значение от 0 до 59.
  • 2: Запускает сценарий bash в 2:00 утра Укажите час между 0 и 23.
  • *: Запускает сценарий bash каждый день месяца. Укажите день между 1 и 31.
  • *: Запускает сценарий bash каждый месяц. Укажите месяц между 1 и 12.
  • *: Ежедневно выполняется сценарий bash. Укажите день недели между 0 и 7.

Перечислите все задания Cron и убедитесь, что новая задача сценария Bash доступна.

1
$ crontab -l

Результат:

1
2
3
4
5
6
# 
# For more information see the manual pages of crontab(5) and cron(8)
# 
# m h  dom mon dow   command

0 2 * * * ~/backup.sh

Автоматизация Bash Script на Linux с помощью Systemd

Systemd автоматически запускает системные службы при загрузке и предлагает варианты остановки и перезапуска услуг. Следуйте приведенным ниже шагам, чтобы настроить скрипт мониторинга Bash, который вы создали ранее в качестве нового системного сервиса, и управлять сервисом с помощью системного.

Создайте новый файл системного сервиса, например logmonitor.service.

1
$ sudo nano /etc/systemd/system/logmonitor.service

Добавьте следующее содержимое в logmonitor.service файл.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[Unit]
Description= Automatic System Logs Monitoring and Filtering
After=network.target

[Service]
ExecStart=bash /opt/log-monitor.sh
Restart=always

[Install]
WantedBy=multi-user.target

Сохраните и закройте файл.

Вышеупомянутая конфигурация службы запускает скрипт log-monitor.sh bash в каталоге /opt для мониторинга и фильтрации записей журнала в файле /var/log/syslog.

Перезагрузка систематизирована для применения изменений в файле службы.

1
$ sudo systemctl daemon-reload

Включите новый системный сервис для автоматического запуска при загрузке.

1
$ sudo systemctl enable logmonitor.service

Результат:

1
Created symlink /etc/systemd/system/multi-user.target.wants/logmonitor.service → /etc/systemd/system/logmonitor.service.

Запустите системный сервис.

1
$ sudo systemctl start logmonitor.service

Запустите следующие команды для имитации новых ошибок и предупреждений в файле /var/log/syslog.

1
2
3
4
$ logger -p user.err "This is a simulated error log message from MySQL"
$ logger -p user.err "This is a simulated warning log message from Apache"
$ logger -p user.err "This is a simulated error log message from PHP"
$ logger -p user.err "This is a simulated Warning log message from MySQL"

Перечислите все файлы в каталоге /opt/data и убедитесь, что файлы error_log.txt и warning_log.txt доступны.

1
$ ls /opt/data

Результат:

1
error_log.txt warning_log.txt

Просмотрите файл error_log.txt и убедитесь, что в файле доступны только записи об ошибке.

1
$ cat error.log

Результат:

1
2
2024-11-18T13:33:48.010096+00:00 Server linuxuser: This is a simulated error log message from MySQL
2024-11-18T13:33:48.010096+00:00 Server linuxuser: This is a simulated error log message from PHP

Завершение

Вы успешно настроили автоматизированные скрипты Bash на сервере Linux с использованием Cron и Systemd. Автоматизация сценариев Bash позволяет выполнять общие задачи системного администрирования, такие как резервное копирование и мониторинг ошибок. Чтобы упростить управление системой, создайте несколько сценариев Bash и заданий Cron, указав необходимые команды для каждого.

Вы также использовали псевдонимы в среде оболочки Bash для создания многоразовых команд. Команда bash alias позволяет запускать несколько команд, используя расширенные функции Bash, такие как условные заявления и циклы для выполнения конкретных задач.

Вы можете поделиться статьей со своими друзьями в социальных сетях, которым может быть интересна эта статья или просто оставить комментарий ниже. Спасибо.