main func

master
serr 2025-04-12 16:41:30 +03:00
parent 01af598e16
commit 439461b258
1 changed files with 50 additions and 49 deletions

59
eye.sh
View File

@ -7,12 +7,10 @@ BINARY_PATH="./main" # Путь до бинарного файла
BUILD_CMD="go build -o $BINARY_PATH main.go" # Команда для сборки BUILD_CMD="go build -o $BINARY_PATH main.go" # Команда для сборки
################################################################################### ###################################################################################
# Нужное для работы скрипта (не менять) # Массивы для хранения информации о директориях
stty -echoctl # Отключает вывод управляющих символов (включая ^C). declare -A LAST_MODS
declare -A LAST_MODS # Ассоциативный массив для хранения времени последней модификации declare -A LAST_COUNTS
declare -A LAST_COUNTS # Ассоциативный массив для хранения количества файлов CLEANUP_DONE=0
CLEANUP_DONE=0 # Была ли уже вызвана cleanup
PID="" # Для хранения PID запущенного процесса
# #
# Для вывода в синем цвете # Для вывода в синем цвете
@ -23,68 +21,68 @@ blue() {
# Функция для очистки при завершении работы скрипта # Функция для очистки при завершении работы скрипта
cleanup() { cleanup() {
[ $CLEANUP_DONE -eq 1 ] && exit 0 [ $CLEANUP_DONE -eq 1 ] && exit 0
CLEANUP_DONE=1
blue "EYE | cleanup..." blue "EYE | cleanup..."
kill_previous kill_previous $1
rm -f $BINARY_PATH rm -f $BINARY_PATH
blue "EYE | see you later!" blue "EYE | see you later!"
CLEANUP_DONE=1
exit 0 exit 0
} }
# Ловушка для сигналов завершения
trap cleanup SIGINT SIGTERM SIGHUP SIGQUIT EXIT
#
# Функция для убийства процесса # Функция для убийства процесса
kill_previous() { kill_previous() {
if [ -n "$PID" ] && kill -0 $PID 2>/dev/null; then # 2>/dev/null глушит ненужные сообщения в stderr local pid=$1
kill $PID if [ -n "$pid" ] && kill -0 $pid 2>/dev/null; then
blue "EYE | process killed (PID: $PID)" kill $pid
blue "EYE | process killed (PID: $pid)"
fi fi
} }
#
# Функция для проверки изменений # Функция для проверки изменений
check_changes() { check_changes() {
local changed=0 local changed=0
for dir in "${WATCH_DIRS[@]}"; do for dir in "${WATCH_DIRS[@]}"; do
# Получаем текущее время модификации и количество файлов
local current_mod=$(find "$dir" -type f -exec stat -c %Y {} \; | sort -nr | head -1) 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) 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 if { [ -n "$current_mod" ] && [ "$current_mod" -gt "${LAST_MODS[$dir]}" ]; } || [ "$current_count" -ne "${LAST_COUNTS[$dir]}" ]; then
changed=1 changed=1
LAST_MODS["$dir"]=$current_mod LAST_MODS["$dir"]=$current_mod
LAST_COUNTS["$dir"]=$current_count LAST_COUNTS["$dir"]=$current_count
[ -n "$PID" ] && blue "EYE | changes detected in \033[35m$dir\033[0m" [ -n "$1" ] && blue "EYE | changes detected in \033[94m$dir\033[0m"
fi fi
done done
return $changed return $changed
} }
#
# Основная функция
main() {
local pid=""
# Ловушка для сигналов завершения
trap 'cleanup $pid' SIGINT SIGTERM SIGHUP SIGQUIT EXIT
# Инициализация массивов # Инициализация массивов
for dir in "${WATCH_DIRS[@]}"; do # @ - обозначает "все элементы массива" for dir in "${WATCH_DIRS[@]}"; do
LAST_MODS["$dir"]=0 LAST_MODS["$dir"]=0
LAST_COUNTS["$dir"]=$(find "$dir" -type f 2>/dev/null | wc -l) LAST_COUNTS["$dir"]=$(find "$dir" -type f 2>/dev/null | wc -l)
blue "EYE | started watching the directory \033[35m$dir\033[0m" blue "EYE | started watching the directory \033[94m$dir\033[0m"
done done
#
# Основной цикл работы скрипта # Основной цикл работы скрипта
while true; do while true; do
check_changes check_changes $pid
if [ $? -eq 1 ]; then if [ $? -eq 1 ]; then
blue "EYE | rebuilding..." blue "EYE | rebuilding..."
$BUILD_CMD 2>/dev/null # Сборка eval $BUILD_CMD 2>/dev/null
if [ $? -eq 0 ]; then # $? - код возврата if [ $? -eq 0 ]; then
blue "EYE | build successful. restarting..." blue "EYE | build successful. restarting..."
kill_previous # Убивает предыдущий процесс kill_previous $pid
$BINARY_PATH & # & — Запускает процесс в фоновом режиме, чтобы eye не зависал $BINARY_PATH &
PID=$! # $! - спец. переменная в bash, содержащая pid последнего запущенного фонового процесса pid=$!
blue "EYE | started new process (PID: $PID)" blue "EYE | started new process (PID: $pid)"
else else
blue "EYE | build failed" blue "EYE | build failed"
fi fi
@ -92,4 +90,7 @@ while true; do
sleep $DURATION sleep $DURATION
done done
}
# #
main