12.3 应用部署

    目前Go程序还不能实现daemon,详细的见这个Go语言的bug:`http://code.google.com/p/go/issues/detail?id=227`,大概的意思说很难从现有的使用的线程中fork一个出来,因为没有一种简单的方法来确保所有已经使用的线程的状态一致性问题。

    但是我们可以看到很多网上的一些实现daemon的方法,例如下面两种方式:

    • 另一种是利用syscall的方案,但是这个方案并不完善: ```Go

    import ( “log” “os” “syscall” )

    func daemon(nochdir, noclose int) int { var ret, ret2 uintptr var err uintptr

    Supervisord安装完成后有两个可用的命令行supervisor和supervisorctl,命令使用解释如下:

    • supervisord,初始启动Supervisord,启动、管理配置中设置的进程。
    • supervisorctl stop programxxx,停止某一个进程(programxxx),programxxx为[program:blogdemon]里配置的值,这个示例就是blogdemon。
    • supervisorctl start programxxx,启动某个进程
    • supervisorctl stop all,停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
    • supervisorctl reload,载入最新的配置文件,并按新的配置启动、管理所有进程。

    这小节我们介绍了Go如何实现daemon化,但是由于目前Go的daemon实现的不足,需要依靠第三方工具来实现应用程序的daemon管理的方式,所以在这里介绍了一个用python写的进程管理工具Supervisord,通过Supervisord可以很方便的把我们的Go应用程序管理起来。