Added file check
This commit is contained in:
parent
c035c7f597
commit
130203c778
1 changed files with 32 additions and 2 deletions
34
main.go
34
main.go
|
|
@ -19,13 +19,43 @@ func main() {
|
||||||
// Lock-файл для предотвращения параллельного запуска
|
// Lock-файл для предотвращения параллельного запуска
|
||||||
// ════════════════════════════════════════════════════════════
|
// ════════════════════════════════════════════════════════════
|
||||||
lockFile := "/var/lock/ptaf-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)
|
f, err := os.OpenFile(lockFile, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0600)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if os.IsExist(err) {
|
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()
|
pid := os.Getpid()
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue