2016-06-13 2 views
1

Я новичок в Go, и у меня есть несколько небольших сервисов.Выйти из приложения изящно

Когда я развертываю новую версию, я обычно просто загружаю новый двоичный файл, kill существующий процесс и запускаю новый.

Мне интересно, правильно ли это сделать, или если есть лучший способ сделать это.

+1

Каковы ваши цели? Нет ничего плохого в том, что вы делаете, и нет ничего действительно отличного для программы Go против любого другого. – JimB

+0

@JimB Я просто убедился, что на самом деле все в порядке. Я предполагаю, что, например, многие HTTP-сервисы завершат обработку любых выданных запросов до выхода. 'kill' чувствует себя не так, но это может быть просто моя неопытность. – Evert

+1

Как и другие, kill-and-restart не так уж редко (в Go или в другом месте). Существует некоторый код, который выходит из его пути, чтобы избежать сброса соединений при перезагрузке: https://github.com/facebookgo/grace – twotwotwo

ответ

3

Нет ничего плохого в убийстве процесса, его замене и перезапуске. Если вы хотите сделать некоторые очистки на выходе вы можете сделать следующее:

import(
    "fmt" 
    "os" 
    "os/signal" 
    "syscall" 
) 

func main(){ 
    //work here 

    go gracefulShutdown() 
    forever := make(chan int) 
    <-forever 
} 

func gracefulShutdown() { 
    s := make(chan os.Signal, 1) 
    signal.Notify(s, os.Interrupt) 
    signal.Notify(s, syscall.SIGTERM) 
    go func() { 
     <-s 
     fmt.Println("Sutting down gracefully.") 
     // clean up here 
     os.Exit(0) 
    }() 
} 

Если вы убить {PID} (без -9 переключателя), процесс будет вызывать gracefullShutdown функцию перед завершением.

+2

Лучший способ без блокировки 'main()' бесконечно: https://play.golang.org/p/X-6_qY810j. Нет причин для того, чтобы стрелять 'gracefulShutdown()' в goroutine, когда он все равно загорается еще один, и это позволяет ** main ** быть тем, кто фактически заканчивает программу (что и должно происходить). Кроме того, в вашей версии навсегда не нужно запускать через 'make', поскольку канал nil блокируется бесконечно. Таким образом, 'var forever chan int 'избегает выделения и работает одинаково. – Kaedys

Смежные вопросы