main func
parent
01af598e16
commit
439461b258
87
eye.sh
87
eye.sh
|
@ -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,73 +21,76 @@ 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
|
||||||
}
|
}
|
||||||
#
|
|
||||||
|
|
||||||
# Инициализация массивов
|
# Основная функция
|
||||||
for dir in "${WATCH_DIRS[@]}"; do # @ - обозначает "все элементы массива"
|
main() {
|
||||||
LAST_MODS["$dir"]=0
|
local pid=""
|
||||||
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
|
trap 'cleanup $pid' SIGINT SIGTERM SIGHUP SIGQUIT EXIT
|
||||||
check_changes
|
|
||||||
if [ $? -eq 1 ]; then
|
# Инициализация массивов
|
||||||
blue "EYE | rebuilding..."
|
for dir in "${WATCH_DIRS[@]}"; do
|
||||||
$BUILD_CMD 2>/dev/null # Сборка
|
LAST_MODS["$dir"]=0
|
||||||
if [ $? -eq 0 ]; then # $? - код возврата
|
LAST_COUNTS["$dir"]=$(find "$dir" -type f 2>/dev/null | wc -l)
|
||||||
blue "EYE | build successful. restarting..."
|
blue "EYE | started watching the directory \033[94m$dir\033[0m"
|
||||||
kill_previous # Убивает предыдущий процесс
|
done
|
||||||
$BINARY_PATH & # & — Запускает процесс в фоновом режиме, чтобы eye не зависал
|
|
||||||
PID=$! # $! - спец. переменная в bash, содержащая pid последнего запущенного фонового процесса
|
# Основной цикл работы скрипта
|
||||||
blue "EYE | started new process (PID: $PID)"
|
while true; do
|
||||||
else
|
check_changes $pid
|
||||||
blue "EYE | build failed"
|
if [ $? -eq 1 ]; then
|
||||||
|
blue "EYE | rebuilding..."
|
||||||
|
eval $BUILD_CMD 2>/dev/null
|
||||||
|
if [ $? -eq 0 ]; then
|
||||||
|
blue "EYE | build successful. restarting..."
|
||||||
|
kill_previous $pid
|
||||||
|
$BINARY_PATH &
|
||||||
|
pid=$!
|
||||||
|
blue "EYE | started new process (PID: $pid)"
|
||||||
|
else
|
||||||
|
blue "EYE | build failed"
|
||||||
|
fi
|
||||||
fi
|
fi
|
||||||
fi
|
|
||||||
|
|
||||||
sleep $DURATION
|
sleep $DURATION
|
||||||
done
|
done
|
||||||
|
}
|
||||||
#
|
#
|
||||||
|
|
||||||
|
main
|
Loading…
Reference in New Issue