#!/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 #