eye-hot-reloader/eye.sh

75 lines
3.1 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
stty -echoctl # Отключает вывод управляющих символов (включая ^C).
# НАСТРОЙКА СКРИПТА ТУТ ###########################################################
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