75 lines
3.1 KiB
Bash
Executable File
75 lines
3.1 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# НАСТРОЙКА СКРИПТА ТУТ ###########################################################
|
||
DURATION=5 # Задержка между проверками в секундах
|
||
WATCH_DIR=posts/ # Директория для наблюдения
|
||
BINARY_PATH="./hikan.ru" # Путь до бинарного файла
|
||
BUILD_CMD="go build -o $BINARY_PATH main.go" # Команда для сборки
|
||
###################################################################################
|
||
|
||
# Нужное для работы скрипта (не менять)
|
||
stty -echoctl # Отключает вывод управляющих символов (включая ^C).
|
||
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 |