From 130203c778044f9126afb632bd920354a9dc364d Mon Sep 17 00:00:00 2001 From: Magnus Root Date: Wed, 15 Apr 2026 17:28:15 +0300 Subject: [PATCH] Added file check --- main.go | 34 ++++++++++++++++++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/main.go b/main.go index befcc12..7142a58 100644 --- a/main.go +++ b/main.go @@ -19,13 +19,43 @@ func main() { // Lock-файл для предотвращения параллельного запуска // ════════════════════════════════════════════════════════════ lockFile := "/var/lock/ptaf-main.lock" + const maxLockAge = 15 * time.Minute f, err := os.OpenFile(lockFile, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0600) if err != nil { if os.IsExist(err) { - log.Fatal("❌ Программа уже запущена! Lock файл существует: ", lockFile) + data, readErr := os.ReadFile(lockFile) + if readErr == nil { + var existingPID int + if _, parseErr := fmt.Sscanf(strings.TrimSpace(string(data)), "%d", &existingPID); parseErr == nil && existingPID > 0 { + // Проверяем существует ли процесс + if _, procErr := os.Stat(fmt.Sprintf("/proc/%d", existingPID)); os.IsNotExist(procErr) { + log.Printf("⚠ Lock файл найден но процесс PID %d не существует — удаляем устаревший lock", existingPID) + os.Remove(lockFile) + f, err = os.OpenFile(lockFile, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0600) + if err != nil { + log.Fatal("❌ Не удалось создать lock файл после очистки: ", err) + } + } else { + // Процесс существует — проверяем возраст lock-файла + if info, statErr := os.Stat(lockFile); statErr == nil { + age := time.Since(info.ModTime()) + if age > maxLockAge { + log.Printf("⚠ Программа уже запущена (PID %d) но работает более %.0f минут — возможно зависла", existingPID, age.Minutes()) + log.Printf(" Если утилита зависла, выполните: kill %d && rm %s", existingPID, lockFile) + } + } + log.Fatalf("❌ Программа уже запущена! PID: %d, Lock файл: %s", existingPID, lockFile) + } + } else { + log.Fatal("❌ Программа уже запущена! Lock файл существует: ", lockFile) + } + } else { + log.Fatal("❌ Программа уже запущена! Lock файл существует: ", lockFile) + } + } else { + log.Fatal("❌ Не удалось создать lock файл: ", err) } - log.Fatal("❌ Не удалось создать lock файл: ", err) } pid := os.Getpid()