Работа с сокетами, как правильно удалить/закрыть?

Всем привет!

Написал приложение и systemd файл. Запускаю, все ок, работает. Приложение слушает unix socket, в него проксирует nginx. Все отлично, но есть небольшая проблема, которая пугает: если прибить процесс sudo kill -9 {pid} не сработает горутина, которая слушает канал на os.Signal, следовательно сокет не закроется. Так вот, если что-то кто-то прибьет процесс, заново он уже не запустится:
listen unix /tmp/app.sock: bind: address already in use

Меня это немного пугает, не хотелось бы обнаружить, что мой сервер сыпет 502 ошибками в самый неожиданный момент.
Вот, собственно, вопрос: как правильно поступить при таком случае? Пробовал os.Remove("/tmp/app.sock") но пишет что такого файла нет. Как правильно обработать данную ситуацию, да и вообще в целом запустить процесс если он был убит через kill -9?
  • Вопрос задан
  • 849 просмотров
Пригласить эксперта
Ответы на вопрос 2
@danforth Автор вопроса
Проблема была в том, что при запросе os.Stat возвращалась err, и я её проверял на os.IsExists(err), но ведь если файл существует, то err будет nil. Переделал на !os.IsNotExists(err) и получилось удалить через os.Remove("/tmp/app.sock")

var l net.Listener
	var err error
	l, err = net.Listen("unix", "/tmp/app.sock")
	if err != nil {
		log.Println(err)
		if _, err := os.Stat("/tmp/app.sock"); !os.IsNotExist(err) {
			log.Println("socket in use, trying to delete the socket")
			err = os.Remove("/tmp/app.sock")
			if err != nil {
				log.Fatalln(err)
			}
			log.Println("socket file removed")
			l, err = net.Listen("unix", "/tmp/app.sock")
			if err != nil {
				log.Fatalln(err)
			}
		}
	}
	defer l.Close()
Ответ написан
Комментировать
@RidgeA
Никак.
Нельзя отловить SIGKILL.

Об этом написано в самом начале доки https://golang.org/pkg/os/signal/.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы