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",
  5.         Run: func(cmd *cobra.Command, args []string) {
  6.             startHttp()
  7.         },
  8.     }
  9.     startCmd.Flags().BoolVarP(&daemon, "deamon", "d", false, "is daemon?")
  10.     RootCmd.AddCommand(startCmd)

  11. }
复制代码
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.     }
  8. }
复制代码
现在通过gonne start便可以启动一个web服务了,但是程序停留在命令行,如果ctrl+C程序也会终止了
命令行参数
如果想要后台启动,那么得让start命令知道是要后台运行的,参照docker命令行的方式就是加上-d,给一个命令添加参数的判断只需很少的代码
改造一下代码
  1. func init() {
  2.     var daemon bool
  3.     startCmd := &cobra.Command{
  4.         Use:   "start",
  5.         Short: "Start Gonne",
  6.         Run: func(cmd *cobra.Command, args []string) {
  7.             if daemon {
  8.         fmt.Println("gonne start",daemon)        
  9.             }
  10.             startHttp()
  11.         },
  12.     }
  13.     startCmd.Flags().BoolVarP(&daemon, "deamon", "d", false, "is daemon?")
  14.     RootCmd.AddCommand(startCmd)

  15. }
复制代码
命令行输入
  1. gonne start -d
复制代码
这样就可以接收到-d参数了,这里要说明一下,第一个参数取值,第二个参数代码--deamon,第三个参数代表-d 
,第四个参数代码不加-d时候的默认值,第五参数是描述
后台运行
后台运行其实这里使用的是一个巧妙的方法,就是使用系统的command命令行启动自己的命令行输入,是不是有点绕,再看看看改造后的代码
  1. Run: func(cmd *cobra.Command, args []string) {
  2.   if daemon {
  3.     command := exec.Command("gonne", "start")
  4.     command.Start()
  5.     fmt.Printf("gonne start, [PID] %d running...\n", command.Process.Pid)
  6.     ioutil.WriteFile("gonne.lock", []byte(fmt.Sprintf("%d", command.Process.Pid)), 0666)
  7.     daemon = false
  8.     os.Exit(0)
  9.   } else {
  10.     fmt.Println("gonne start")
  11.   }
  12.   startHttp()
  13. },
复制代码
用exec的Command启动刚输入的gonne start -d,就会拦截到这条请求然后通过gonne start,但是程序就不会停留在命令行了,然后发现http服务还在,还可以访问。
还有一点就是把pid输出到gonne.lock文件,给停止的程序调用
终止后台程序
有了之前的操作后,停止就简单多了
  1. func init() {
  2.     RootCmd.AddCommand(stopCmd)
  3. }

  4. var stopCmd = &cobra.Command{
  5.     Use:   "stop",
  6.     Short: "Stop Gonne",
  7.     Run: func(cmd *cobra.Command, args []string) {
  8.         strb, _ := ioutil.ReadFile("gonne.lock")
  9.         command := exec.Command("kill", string(strb))
  10.         command.Start()
  11.         println("gonne stop")
  12.     },
  13. }
复制代码
执行 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. Usage:
  4.   gonne start [flags]

  5. Flags:
  6.   -d, --deamon   is daemon?
  7.   -h, --help     help for start
复制代码

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值