В этой статье я поделюсь способом изменить конфигурацию скрипта на лету, не прерывая его выполнение. Представьте, что у вас есть скрипт, который обрабатывает файлы, и он уже обработал половину из миллиона файлов. Вам нужно внести небольшое изменение — например, добавить задержку между обработкой файлов. Но вы не хотите останавливать процесс, который уже идет. К счастью, есть простой способ сделать это.
Еще по теме: Лучшие инструменты сисадмина
Сигналы в Linux
Для начала немного расскажу о сигналах в Linux и других Unix-подобных операционных системах. Сигналы — это способ сообщить процессу о каком-то событии. Это программные прерывания, которые операционная система отправляет процессу, чтобы указать на событие или состояние, требующее внимания.
Некоторые из наиболее распространенных сигналов:
- SIGINT — прерывает выполнение процесса с клавиатуры (например, при нажатии Ctrl+C).
- SIGKILL — немедленно завершает процесс, его нельзя перехватить, заблокировать или игнорировать (используется как kill -9 ).
- SIGHUP — часто используется для того, чтобы указать процессу, что ему нужно перечитать свою конфигурацию (используется как kill -HUP ).
Для того, чтобы заставить скрипт перечитать конфигурацию, мы будем использовать сигнал SIGHUP.
Создание скрипта и файла конфигурации
Теперь создадим скрипт и файл конфигурации. Скрипт будет считывать свой конфигурационный файл при старте, а затем мы добавим в него возможность перечитывать конфигурацию во время выполнения, не прерывая его.
Сначала создайте файл конфигурации config.cfg:
1 |
sleep_value=2 |
Теперь создайте файл скрипта myscript.sh:
1 |
#!/bin/bash read_config() { echo "Чтение конфигурации." source ./config.cfg } trap 'read_config' SIGHUP read_config counter=0 while true; do counter=$((counter+1)) echo "Обработка файла ${counter} .." echo "Задержка на ${sleep_value} секунд." sleep $sleep_value done |
Дайте скрипту права на выполнение с помощью команды:
1 |
chmod +x ./myscript.sh |
Запустите скрипт, и он начнет обрабатывать файлы, делая задержку между ними в 2 секунды:
1 |
Чтение конфигурации. Обработка файла 1 .. Задержка на 2 секунд. Обработка файла 2 .. Задержка на 2 секунд. |
Теперь, откройте другое окно терминала и измените файл конфигурации config.cfg, установив новое значение задержки:
1 |
sleep_value=10 |
Сохраните файл и найдите PID вашего скрипта с помощью команды:
1 |
ps aux | grep -i myscript.sh | grep -v grep | tr -s " " | cut -d " " -f2 2544 |
Вместо 2544 у вас будет другое значение.
Теперь отправьте сигнал SIGHUP скрипту, чтобы он перечитал конфигурацию:
1 |
kill -HUP 2544 |
Вернувшись в окно с запущенным скриптом, вы увидите, что значение задержки изменилось на 10 секунд, а счетчик обработанных файлов продолжает увеличиваться с того же места:
1 |
Обработка файла 121 .. Задержка на 2 секунд. Обработка файла 122 .. Задержка на 2 секунд. Чтение конфигурации. Обработка файла 123 .. Задержка на 10 секунд. Обработка файла 124 .. Задержка на 10 секунд. |
Все волшебство в этом скрипте происходит благодаря команде trap. Она настроена на выполнение определенной функции при поступлении конкретного сигнала. В нашем случае, мы настроили trap так, чтобы она выполняла функцию read_config при получении сигнала SIGHUP, который указывает процессу перечитать конфигурацию.
1 |
trap 'read_config' SIGHUP |
Функция read_config очень проста: она использует команду source, чтобы загрузить переменные из файла config.cfg. Обратите внимание, что с помощью source можно загружать не только переменные, но и функции, делая их доступными в основном скрипте.
1 |
source ./config.cfg |
Знание того, как заставить скрипт перечитывать конфигурационный файл во время выполнения, — это важный навык, который делает ваши скрипты более надежными и умными. Удачного кодинга!
ПОЛЕЗНЫЕ ССЫЛКИ: