#!/bin/bash stty -echoctl # Отключает вывод управляющих символов по типу ^C # НАСТРОЙКА СКРИПТА ТУТ ########################################################### DURATION=1 # Задержка между проверками в секундах WATCH_TARGETS=("assets" "mvc" "posts" "tools" "main.go") # Массив целей для наблюдения (директории и файлы) 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[34mEYE | $1\033[0m" } # Очистка при завершении работы скрипта cleanup() { [ $CLEANUP_DONE -eq 1 ] && exit 0 blue "cleanup..." kill_proc $1 rm -f $BINARY_PATH blue "see you later!" CLEANUP_DONE=1 exit 0 } # Убийство процесса по его pid kill_proc() { local pid=$1 if [ -n "$pid" ] && kill -0 $pid 2>/dev/null; then kill $pid blue "process killed (PID: $pid)" fi } # Проверка изменений в целях check_changes() { local changed=0 for target in "${WATCH_TARGETS[@]}"; do local current_mod=0 local current_count=0 if [ -f "$target" ]; then # Обработка файла current_mod=$(stat -c %Y "$target") current_count=1 elif [ -d "$target" ]; then # Обработка директории current_mod=$(find "$target" -type f -exec stat -c %Y {} \; | sort -nr | head -1) current_count=$(find "$target" -type f | wc -l) fi if { [ -n "$current_mod" ] && [ "${LAST_MODS[$target]:-0}" -lt "$current_mod" ]; } || [ "${LAST_COUNTS[$target]:-0}" -ne "$current_count" ]; then changed=1 LAST_MODS["$target"]=$current_mod LAST_COUNTS["$target"]=$current_count [ -n "$1" ] && blue "changes detected in \033[94m$target\033[0m" fi done return $changed } # Основная функция main() { local pid="" # Ловушка для сигналов завершения trap 'cleanup $pid' SIGINT SIGTERM SIGHUP SIGQUIT EXIT # Инициализация массивов for target in "${WATCH_TARGETS[@]}"; do if [ -f "$target" ]; then LAST_MODS["$target"]=0 LAST_COUNTS["$target"]=1 elif [ -d "$target" ]; then LAST_MODS["$target"]=0 LAST_COUNTS["$target"]=$(find "$target" -type f | wc -l) fi blue "started watching \033[94m$target\033[0m" done # Основной цикл работы скрипта while true; do check_changes $pid if [ $? -eq 1 ]; then blue "rebuilding..." $BUILD_CMD if [ $? -eq 0 ]; then blue "build successful. restarting..." kill_proc $pid $BINARY_PATH & pid=$! blue "started new process (PID: $pid)" else blue "build failed" fi fi sleep $DURATION done } main