Remove check ports for new containers
This commit is contained in:
parent
707407a433
commit
38ab8369cb
2 changed files with 29 additions and 47 deletions
|
|
@ -194,6 +194,7 @@ func setupContainers(config Config, clientTitle string, clientInfo *ClientInfo,
|
||||||
|
|
||||||
if containerExists {
|
if containerExists {
|
||||||
if composeChanges[containerNum] {
|
if composeChanges[containerNum] {
|
||||||
|
updateLockStatus(fmt.Sprintf("recreating container: %s", containerFullName))
|
||||||
success := recreateContainer(containerFullName, composeFile, containerDir, clientTitle, resources, resourcePortMap, containerNum)
|
success := recreateContainer(containerFullName, composeFile, containerDir, clientTitle, resources, resourcePortMap, containerNum)
|
||||||
if success {
|
if success {
|
||||||
if err := saveContainerPorts(containerDir, containerNum, resources, containerPorts); err != nil {
|
if err := saveContainerPorts(containerDir, containerNum, resources, containerPorts); err != nil {
|
||||||
|
|
@ -263,50 +264,7 @@ func setupContainers(config Config, clientTitle string, clientInfo *ClientInfo,
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Printf(" Запуск нового контейнера %s", containerName)
|
log.Printf(" Запуск нового контейнера %s", containerName)
|
||||||
|
updateLockStatus(fmt.Sprintf("starting container: %s", containerFullName))
|
||||||
// Собираем порты которые должен занять контейнер
|
|
||||||
portsToCheck := []int{}
|
|
||||||
for _, res := range resources {
|
|
||||||
ports, ok := resourcePortMap[res.L7ResourceID]
|
|
||||||
if !ok || containerNum-1 >= len(ports) {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
pm := ports[containerNum-1]
|
|
||||||
for _, dockerPort := range pm.HTTPPorts {
|
|
||||||
portsToCheck = append(portsToCheck, dockerPort)
|
|
||||||
}
|
|
||||||
for _, dockerPort := range pm.HTTPSPorts {
|
|
||||||
portsToCheck = append(portsToCheck, dockerPort)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Ждём освобождения портов перед запуском
|
|
||||||
if len(portsToCheck) > 0 {
|
|
||||||
portsReady := false
|
|
||||||
for attempt := 0; attempt < 30; attempt++ {
|
|
||||||
busy := false
|
|
||||||
for _, port := range portsToCheck {
|
|
||||||
if isPortBusyByAnyProcess(port) {
|
|
||||||
if attempt == 0 {
|
|
||||||
log.Printf(" → Порт %d занят, ожидаем освобождения...", port)
|
|
||||||
}
|
|
||||||
busy = true
|
|
||||||
break
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if !busy {
|
|
||||||
portsReady = true
|
|
||||||
if attempt > 0 {
|
|
||||||
log.Printf(" ✓ Порты освободились (попытка %d)", attempt+1)
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
time.Sleep(1 * time.Second)
|
|
||||||
}
|
|
||||||
if !portsReady {
|
|
||||||
log.Printf(" ⚠ Порты не освободились за 30 секунд, пробуем запустить всё равно")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
const maxRetries = 3
|
const maxRetries = 3
|
||||||
started := false
|
started := false
|
||||||
|
|
|
||||||
30
main.go
30
main.go
|
|
@ -14,6 +14,18 @@ import (
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
var lockStatusFile *os.File
|
||||||
|
|
||||||
|
// updateLockStatus обновляет статус в lock-файле для диагностики зависаний
|
||||||
|
func updateLockStatus(status string) {
|
||||||
|
if lockStatusFile == nil {
|
||||||
|
return
|
||||||
|
}
|
||||||
|
lockStatusFile.Seek(0, 0)
|
||||||
|
lockStatusFile.Truncate(0)
|
||||||
|
lockStatusFile.WriteString(fmt.Sprintf("%d\n%s\n", os.Getpid(), status))
|
||||||
|
}
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
// ════════════════════════════════════════════════════════════
|
// ════════════════════════════════════════════════════════════
|
||||||
// Lock-файл для предотвращения параллельного запуска
|
// Lock-файл для предотвращения параллельного запуска
|
||||||
|
|
@ -26,8 +38,9 @@ func main() {
|
||||||
if os.IsExist(err) {
|
if os.IsExist(err) {
|
||||||
data, readErr := os.ReadFile(lockFile)
|
data, readErr := os.ReadFile(lockFile)
|
||||||
if readErr == nil {
|
if readErr == nil {
|
||||||
|
lines := strings.SplitN(strings.TrimSpace(string(data)), "\n", 2)
|
||||||
var existingPID int
|
var existingPID int
|
||||||
if _, parseErr := fmt.Sscanf(strings.TrimSpace(string(data)), "%d", &existingPID); parseErr == nil && existingPID > 0 {
|
if _, parseErr := fmt.Sscanf(lines[0], "%d", &existingPID); parseErr == nil && existingPID > 0 {
|
||||||
// Проверяем существует ли процесс
|
// Проверяем существует ли процесс
|
||||||
if _, procErr := os.Stat(fmt.Sprintf("/proc/%d", existingPID)); os.IsNotExist(procErr) {
|
if _, procErr := os.Stat(fmt.Sprintf("/proc/%d", existingPID)); os.IsNotExist(procErr) {
|
||||||
log.Printf("⚠ Lock файл найден но процесс PID %d не существует — удаляем устаревший lock", existingPID)
|
log.Printf("⚠ Lock файл найден но процесс PID %d не существует — удаляем устаревший lock", existingPID)
|
||||||
|
|
@ -37,15 +50,22 @@ func main() {
|
||||||
log.Fatal("❌ Не удалось создать lock файл после очистки: ", err)
|
log.Fatal("❌ Не удалось создать lock файл после очистки: ", err)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
// Процесс существует — проверяем возраст lock-файла
|
// Процесс существует — проверяем возраст и показываем статус
|
||||||
|
status := "unknown"
|
||||||
|
if len(lines) > 1 && lines[1] != "" {
|
||||||
|
status = lines[1]
|
||||||
|
}
|
||||||
if info, statErr := os.Stat(lockFile); statErr == nil {
|
if info, statErr := os.Stat(lockFile); statErr == nil {
|
||||||
age := time.Since(info.ModTime())
|
age := time.Since(info.ModTime())
|
||||||
if age > maxLockAge {
|
if age > maxLockAge {
|
||||||
log.Printf("⚠ Программа уже запущена (PID %d) но работает более %.0f минут — возможно зависла", existingPID, age.Minutes())
|
log.Printf("⚠ Программа уже запущена (PID %d) но работает более %.0f минут — возможно зависла", existingPID, age.Minutes())
|
||||||
|
log.Printf(" Текущий статус: %s", status)
|
||||||
log.Printf(" Если утилита зависла, выполните: kill %d && rm %s", existingPID, lockFile)
|
log.Printf(" Если утилита зависла, выполните: kill %d && rm %s", existingPID, lockFile)
|
||||||
|
} else {
|
||||||
|
log.Printf(" Текущий статус: %s", status)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
log.Fatalf("❌ Программа уже запущена! PID: %d, Lock файл: %s", existingPID, lockFile)
|
log.Fatalf("❌ Программа уже запущена! PID: %d, статус: %s, Lock файл: %s", existingPID, status, lockFile)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
log.Fatal("❌ Программа уже запущена! Lock файл существует: ", lockFile)
|
log.Fatal("❌ Программа уже запущена! Lock файл существует: ", lockFile)
|
||||||
|
|
@ -60,14 +80,17 @@ func main() {
|
||||||
|
|
||||||
pid := os.Getpid()
|
pid := os.Getpid()
|
||||||
f.WriteString(fmt.Sprintf("%d\n", pid))
|
f.WriteString(fmt.Sprintf("%d\n", pid))
|
||||||
|
lockStatusFile = f
|
||||||
|
|
||||||
defer func() {
|
defer func() {
|
||||||
|
lockStatusFile = nil
|
||||||
f.Close()
|
f.Close()
|
||||||
os.Remove(lockFile)
|
os.Remove(lockFile)
|
||||||
log.Printf("✓ Lock файл удален")
|
log.Printf("✓ Lock файл удален")
|
||||||
}()
|
}()
|
||||||
|
|
||||||
log.Printf("✓ Lock файл создан: %s (PID: %d)", lockFile, pid)
|
log.Printf("✓ Lock файл создан: %s (PID: %d)", lockFile, pid)
|
||||||
|
updateLockStatus("init")
|
||||||
// ════════════════════════════════════════════════════════════
|
// ════════════════════════════════════════════════════════════
|
||||||
|
|
||||||
log.Println("=== Запуск программы управления конфигурациями PTAF ===")
|
log.Println("=== Запуск программы управления конфигурациями PTAF ===")
|
||||||
|
|
@ -293,6 +316,7 @@ func processInstance(db *sql.DB, config Config, hostname, instanceName string, p
|
||||||
// Роутер по waf_vendor: направляет клиента в PTAF или SW процессор.
|
// Роутер по waf_vendor: направляет клиента в PTAF или SW процессор.
|
||||||
func processClient(db *sql.DB, config Config, hostname, instanceName string, clientInfo ClientInfo, portAllocator *PortAllocator) bool {
|
func processClient(db *sql.DB, config Config, hostname, instanceName string, clientInfo ClientInfo, portAllocator *PortAllocator) bool {
|
||||||
log.Printf("\n--- Обработка клиента: %s (instance: %s) ---", clientInfo.ClientTitle, instanceName)
|
log.Printf("\n--- Обработка клиента: %s (instance: %s) ---", clientInfo.ClientTitle, instanceName)
|
||||||
|
updateLockStatus(fmt.Sprintf("processing client: %s", clientInfo.ClientTitle))
|
||||||
|
|
||||||
appsSettingsList, err := getAppsSettingsByClientTitle(db, clientInfo.ClientTitle)
|
appsSettingsList, err := getAppsSettingsByClientTitle(db, clientInfo.ClientTitle)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue