eye-hot-reloader/eye.sh

97 lines
2.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" # Команда для сборки
###################################################################################
# Массивы для хранения информации о директориях
declare -A LAST_MODS
declare -A LAST_COUNTS
CLEANUP_DONE=0
#
# Для вывода в синем цвете
blue() {
echo -e "\033[34m$1\033[0m"
}
# Функция для очистки при завершении работы скрипта
cleanup() {
[ $CLEANUP_DONE -eq 1 ] && exit 0
blue "EYE | cleanup..."
kill_previous $1
rm -f $BINARY_PATH
blue "EYE | see you later!"
CLEANUP_DONE=1
exit 0
}
# Функция для убийства процесса
kill_previous() {
local pid=$1
if [ -n "$pid" ] && kill -0 $pid 2>/dev/null; then
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 "$1" ] && blue "EYE | changes detected in \033[94m$dir\033[0m"
fi
done
return $changed
}
# Основная функция
main() {
local pid=""
# Ловушка для сигналов завершения
trap 'cleanup $pid' SIGINT SIGTERM SIGHUP SIGQUIT EXIT
#
# Инициализация массивов
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[94m$dir\033[0m"
done
#
# Основной цикл работы скрипта
while true; do
check_changes $pid
if [ $? -eq 1 ]; then
blue "EYE | rebuilding..."
eval $BUILD_CMD 2>/dev/null
if [ $? -eq 0 ]; then
blue "EYE | build successful. restarting..."
kill_previous $pid
$BINARY_PATH &
pid=$!
blue "EYE | started new process (PID: $pid)"
else
blue "EYE | build failed"
fi
fi
sleep $DURATION
done
}
main