Как изменить работающий в Linux скрипт без его остановки

Bash Kali Linux

В этой статье я поделюсь способом изменить конфигурацию скрипта на лету, не прерывая его выполнение. Представьте, что у вас есть скрипт, который обрабатывает файлы, и он уже обработал половину из миллиона файлов. Вам нужно внести небольшое изменение — например, добавить задержку между обработкой файлов. Но вы не хотите останавливать процесс, который уже идет. К счастью, есть простой способ сделать это.

Еще по теме: Лучшие инструменты сисадмина

Сигналы в Linux

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

Некоторые из наиболее распространенных сигналов:

  • SIGINT — прерывает выполнение процесса с клавиатуры (например, при нажатии Ctrl+C).
  • SIGKILL — немедленно завершает процесс, его нельзя перехватить, заблокировать или игнорировать (используется как kill -9 ).
  • SIGHUP — часто используется для того, чтобы указать процессу, что ему нужно перечитать свою конфигурацию (используется как kill -HUP ).

Для того, чтобы заставить скрипт перечитать конфигурацию, мы будем использовать сигнал SIGHUP.

Создание скрипта и файла конфигурации

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

Сначала создайте файл конфигурации config.cfg:

Теперь создайте файл скрипта myscript.sh:

Дайте скрипту права на выполнение с помощью команды:

Запустите скрипт, и он начнет обрабатывать файлы, делая задержку между ними в 2 секунды:

Теперь, откройте другое окно терминала и измените файл конфигурации config.cfg, установив новое значение задержки:

Сохраните файл и найдите PID вашего скрипта с помощью команды:

Вместо 2544 у вас будет другое значение.

Теперь отправьте сигнал SIGHUP скрипту, чтобы он перечитал конфигурацию:

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

Все волшебство в этом скрипте происходит благодаря команде trap. Она настроена на выполнение определенной функции при поступлении конкретного сигнала. В нашем случае, мы настроили trap так, чтобы она выполняла функцию read_config при получении сигнала SIGHUP, который указывает процессу перечитать конфигурацию.

Функция read_config очень проста: она использует команду source, чтобы загрузить переменные из файла config.cfg. Обратите внимание, что с помощью source можно загружать не только переменные, но и функции, делая их доступными в основном скрипте.

Знание того, как заставить скрипт перечитывать конфигурационный файл во время выполнения, — это важный навык, который делает ваши скрипты более надежными и умными. Удачного кодинга!

ПОЛЕЗНЫЕ ССЫЛКИ:

_Eret1k_

DevOps и циничный атеист. Обожаю запах свежих багов по утрам.

Добавить комментарий