微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

golang进阶(三)——后台进程的启动和停止

原文链接


+++
title=”golang进阶(三)——后台进程的启动和停止”
date=”2017-10-12”
tags=[“golang”,”cobra”]
categories=[“资源管理”]
description=”不想再像java或者其他语言那样为了操作后台程序写各种脚本的话,这篇文章值得你一看”
featured=true
image=”img/201710/fengjing2.jpg”
+++
不想再像java或者其他语言那样为了操作后台程序写各种脚本的话,这篇文章值得你一看
启动命令
上一篇文章一样,我们先来个非后台运行的启动命令
  1. func init() {
  2. startCmd := &cobra.Command{
  3. Use: "start",
  4. Short: "Start Gonne",serif; font-size:12px; line-height:1.8em"> Run: func(cmd *cobra.Command,args []string) {
  5. startHttp()
  6. },serif; font-size:12px; line-height:1.8em"> }
  7. startCmd.Flags().BoolVarP(&daemon,"deamon","d",false,"is daemon?")
  8. RootCmd.AddCommand(startCmd)

  9. }
复制代码
startHttp方法启动一个http的web服务
  1. func startHttp() {
  2. http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request) {
  3. fmt.Fprintf(w,"Hello cmd!")
  4. })
  5. if err := http.ListenAndServe(":9090",nil); err != nil {
  6. log.Fatal("ListenAndServe: ",err)
  7. 复制代码
现在通过gonne start便可以启动一个web服务了,但是程序停留在命令行,如果ctrl+C程序也会终止了
命令行参数
如果想要后台启动,那么得让start命令知道是要后台运行的,参照docker命令行的方式就是加上-d,给一个命令添加参数的判断只需很少的代码
改造一下代码
  1. var daemon bool
  2. if daemon {
  3. fmt.Println("gonne start",daemon)
  4. }
  5. 命令行输入
    1. gonne start -d
    这样就可以接收到-d参数了,这里要说明一下,第一个参数取值,第二个参数代码--deamon,第三个参数代表-d
    ,第四个参数代码不加-d时候的认值,第五参数是描述
    后台运行
    后台运行其实这里使用的是一个巧妙的方法,就是使用系统的command命令行启动自己的命令行输入,是不是有点绕,再看看看改造后的代码
    1. Run: func(cmd *cobra.Command,serif; font-size:12px; line-height:1.8em"> if daemon {
    2. command := exec.Command("gonne","start")
    3. command.Start()
    4. fmt.Printf("gonne start,[PID] %d running...\n",command.Process.Pid)
    5. IoUtil.WriteFile("gonne.lock",[]byte(fmt.Sprintf("%d",command.Process.Pid)),0666)
    6. daemon = false
    7. os.Exit(0)
    8. } else {
    9. fmt.Println("gonne start")
    10. }
    11. startHttp()
    12. },
    用exec的Command启动刚输入的gonne start -d,就会拦截到这条请求然后通过gonne start,但是程序就不会停留在命令行了,然后发现http服务还在,还可以访问。
    还有一点就是把pid输出到gonne.lock文件,给停止的程序调用
    终止后台程序
    有了之前的操作后,停止就简单多了
    1. RootCmd.AddCommand(stopCmd)
    2. var stopCmd = &cobra.Command{
    3. Use: "stop",serif; font-size:12px; line-height:1.8em"> Short: "Stop Gonne",serif; font-size:12px; line-height:1.8em"> strb,_ := IoUtil.ReadFile("gonne.lock")
    4. command := exec.Command("kill",string(strb))
    5. println("gonne stop")
    6. 执行 gonne stop 即可终止之前启动的http服务
    help命令
    好了,关于命令的操作讲完了,再看看cobra给的福利,自动生成的help命令
    这个不需要你做什么操作,只需要输入gonne help,相关信息已经帮你生产好了。
    1. appletekiMacBook-Pro:andev apple$ gonne help
    2. Usage:
    3. gonne [flags]
    4. gonne [command]
    5. Available Commands:
    6. help Help about any command
    7. start Start Gonne
    8. stop Stop Gonne
    9. version Print the version number of Gonne
    10. Flags:
    11. -h,--help help for gonne
    12. Use "gonne [command] --help" for more information about a command.
    当然,子命令也有
    1. appletekiMacBook-Pro:andev apple$ gonne start -h
    2. Start Gonne
    3. gonne start [flags]
    4. -d,--deamon is daemon?
    5. 复制代码

    原文地址:https://www.jb51.cc/go/187734.html

    版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐