#!/bin/bash # НАСТРОЙКА СКРИПТА ТУТ ########################################################### DURATION=5 # Задержка между проверками в секундах WATCH_DIR=posts/ # Директория для наблюдения BINARY_PATH="./hikan.ru" # Путь до бинарного файла BUILD_CMD="go build -o $BINARY_PATH main.go" # Команда для сборки ################################################################################### # Нужное для работы скрипта (не менять) LAST_MOD=0 # Для хранения времени последней модификации LAST_COUNT=0 # Для хранения количества файлов 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 | killed previous process (PID: $PID)" fi } # # Функция для подсчета файлов в директории count_files() { find "$WATCH_DIR" -type f | wc -l } # LAST_COUNT=$(count_files) [ $LAST_COUNT = 0 ] && blue "EYE | empty dir" while true; do CURRENT_MOD=$(find "$WATCH_DIR" -type f -exec stat -c %Y {} \; | sort -nr | head -1) # Время последнего изменения в папке WATCH_DIR CURRENT_COUNT=$(count_files) if { [ -n "$CURRENT_MOD" ] && [ "$CURRENT_MOD" -gt "$LAST_MOD" ]; } || [ "$CURRENT_COUNT" -ne "$LAST_COUNT" ]; then LAST_MOD=$CURRENT_MOD LAST_COUNT=$CURRENT_COUNT blue "EYE | detected changes. 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