Pull to refresh
1
Alexey Shtykov@ifdru

Разработчик приложений/бэкэнда

0,2
Rating
Send message

Волею судеб я занимаюсь престранными вещами, вроде написания Go бэкэнда под Windows. С опцией переноса его в Linux контейнер. Можно было бы сразу разрабатывать под контейнер, но на моей рабочей машине недостаточно оперативки для комфортной разработки.

Мой бэкэнд реализует ряд REST API функций и начинает свою работу с ловли входящих соединений на порту. Для этого я использовал net.Listener, который как выяснилось испытывает сложности с повторным захватом порта, а SO_REUSEADDR, который прекрасно работает в С++ в Go работает, как-то, не очень. Автоматический запуск приводил к порождению бесконечного числа процессов, которые только писали в лог ошибки безо всякой полезной деятельности. И когда мне надоело заставлять это работать я решил использовать старый и проверенный метод: сделать так, чтобы бэкэнд запускался по каждому порту один раз. Оставим в стороне неинтересные подробности того как связывать процессы с конечными точками (endpoints).

И всё было прекрасно до тех пор, пока я не добрался до того, что os.FindProcess() всегда находит процесс. Даже если процесс уже завершился. В случае запуска на POSIX системе можно было бы использовать process.Kill(0), но на моём Windows 11 это не работает. И, в условно переносимом коде появилась ветка для Windows:

var perr *os.SyscallError if runtime.GOOS == "windows" && errors.As(errKill, &perr) && errors.Is(perr.Err, syscall.ERROR_ACCESS_DENIED) {
log.Warnf("unable to kill dead process: %d. Error: %v", pid, perr)
} else {
log.Warnf("unable to kill process: %d. Error: %v", pid, errKill)
return errors.New("previous process running")
}

А морали в данном посте не будет. Для меня это сильно похоже на Python, где я также делил код на Windows и POSIX. Вполне вероятно, что я просто не знаю простого и лёгкого способа добиться необходимого мне поведения.

Tags:
+1
Comments6

Information

Rating
3,435-th
Location
Санкт-Петербург, Санкт-Петербург и область, Россия
Date of birth
Registered
Activity

Specialization

Бэкенд разработчик, Разработчик приложений
Старший
From 250,000 ₽
Git
C++
PostgreSQL
Python
Linux
Oracle
Английский язык
ООП
Bash
Golang