eye-hot-reloader/eye.sh

95 lines
3.9 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#!/bin/bash
# НАСТРОЙКА СКРИПТА ТУТ ###########################################################
DURATION=1 # Задержка между проверками в секундах
WATCH_DIRS=("folder1" "folder2" "empty") # Массив директорий для наблюдения
BINARY_PATH="./main" # Путь до бинарного файла
BUILD_CMD="go build -o $BINARY_PATH main.go" # Команда для сборки
###################################################################################
# Нужное для работы скрипта (не менять)
stty -echoctl # Отключает вывод управляющих символов (включая ^C).
declare -A LAST_MODS # Ассоциативный массив для хранения времени последней модификации
declare -A LAST_COUNTS # Ассоциативный массив для хранения количества файлов
CLEANUP_DONE=0 # Была ли уже вызвана cleanup
PID="" # Для хранения PID запущенного процесса
#
# Для вывода в синем цвете
blue() {
echo -e "\033[34m$1\033[0m"
}
# Функция для очистки при завершении работы скрипта
cleanup() {
[ $CLEANUP_DONE -eq 1 ] && exit 0
CLEANUP_DONE=1
blue "EYE | cleanup..."
kill_previous
rm -f $BINARY_PATH
blue "EYE | see you later!"
exit 0
}
# Ловушка для сигналов завершения
trap cleanup SIGINT SIGTERM SIGHUP SIGQUIT EXIT
#
# Функция для убийства процесса
kill_previous() {
if [ -n "$PID" ] && kill -0 $PID 2>/dev/null; then # 2>/dev/null глушит ненужные сообщения в stderr
kill $PID
blue "EYE | process killed (PID: $PID)"
fi
}
#
# Функция для проверки изменений
check_changes() {
local changed=0
for dir in "${WATCH_DIRS[@]}"; do
# Получаем текущее время модификации и количество файлов
local current_mod=$(find "$dir" -type f -exec stat -c %Y {} \; | sort -nr | head -1)
local current_count=$(find "$dir" -type f 2>/dev/null | wc -l)
# Проверяем изменения
if { [ -n "$current_mod" ] && [ "$current_mod" -gt "${LAST_MODS[$dir]}" ]; } || [ "$current_count" -ne "${LAST_COUNTS[$dir]}" ]; then
changed=1
LAST_MODS["$dir"]=$current_mod
LAST_COUNTS["$dir"]=$current_count
[ -n "$PID" ] && blue "EYE | changes detected in \033[35m$dir\033[0m"
fi
done
return $changed
}
#
# Инициализация массивов
for dir in "${WATCH_DIRS[@]}"; do # @ - обозначает "все элементы массива"
LAST_MODS["$dir"]=0
LAST_COUNTS["$dir"]=$(find "$dir" -type f 2>/dev/null | wc -l)
blue "EYE | started watching the directory \033[35m$dir\033[0m"
done
#
# Основной цикл работы скрипта
while true; do
check_changes
if [ $? -eq 1 ]; then
blue "EYE | rebuilding..."
$BUILD_CMD 2>/dev/null # Сборка
if [ $? -eq 0 ]; then # $? - код возврата
blue "EYE | build successful. restarting..."
kill_previous # Убивает предыдущий процесс
$BINARY_PATH & # & — Запускает процесс в фоновом режиме, чтобы eye не зависал
PID=$! # $! - спец. переменная в bash, содержащая pid последнего запущенного фонового процесса
blue "EYE | started new process (PID: $PID)"
else
blue "EYE | build failed"
fi
fi
sleep $DURATION
done
#