前端之家收集整理的这篇文章主要介绍了
golang进阶(三)——后台进程的启动和停止,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
原文链接
+++
title=”golang进阶(三)——后台进程的启动和停止”
date=”2017-10-12”
tags=[“golang”,”cobra”]
categories=[“资源管理”]
description=”不想再像java或者其他语言那样为了操作后台程序写各种脚本的话,这篇文章值得你一看”
featured=true
image=”img/201710/fengjing2.jpg”
+++
不想再像java或者其他语言那样为了操作
后台程序写各种脚本的话,这篇
文章值得你一看
启动命令
- func init() {
- startCmd := &cobra.Command{
- Use: "start",
- Short: "Start Gonne",serif; font-size:12px; line-height:1.8em"> Run: func(cmd *cobra.Command,args []string) {
- startHttp()
- },serif; font-size:12px; line-height:1.8em"> }
- startCmd.Flags().BoolVarP(&daemon,"deamon","d",false,"is daemon?")
- RootCmd.AddCommand(startCmd)
-
- }
复制代码
startHttp方法启动一个http的web服务
- func startHttp() {
- http.HandleFunc("/",func(w http.ResponseWriter,r *http.Request) {
- fmt.Fprintf(w,"Hello cmd!")
- })
- if err := http.ListenAndServe(":9090",nil); err != nil {
- log.Fatal("ListenAndServe: ",err)
- 复制代码
现在通过gonne start便可以启动一个web服务了,但是程序停留在命令行,如果ctrl+C程序也会终止了
命令行参数
如果想要
后台启动,那么得让start命令知道是要
后台运行的,参照docker命令行的方式就是
加上-d,给一个命令
添加参数的判断只需很少的
代码
- var daemon bool
- if daemon {
- fmt.Println("gonne start",daemon)
- }
- 命令行输入
@H_
301_122@
- gonne start -d
这样就可以接收到-d参数了,这里要说明一下,第一个参数取值,第二个参数代码--deamon,第三个参数代表-d
,第四个参数代码不加-d时候的默认值,第五参数是描述
后台运行
后台运行其实这里使用的是一个巧妙的
方法,就是使用系统的command命令行启动自己的命令行输入,是不是有点绕,再看看看改造后的
代码
- Run: func(cmd *cobra.Command,serif; font-size:12px; line-height:1.8em"> if daemon {
- command := exec.Command("gonne","start")
- command.Start()
- fmt.Printf("gonne start,[PID] %d running...\n",command.Process.Pid)
- IoUtil.WriteFile("gonne.lock",[]byte(fmt.Sprintf("%d",command.Process.Pid)),0666)
- daemon = false
- os.Exit(0)
- } else {
- fmt.Println("gonne start")
- }
- startHttp()
- },
用exec的Command启动刚输入的gonne start -d,就会拦截到这条请求然后通过gonne start,但是程序就不会停留在命令行了,然后发现http服务还在,还可以访问。
还有一点就是把pid
输出到gonne.lock
文件,给停止的程序
调用
终止后台程序
有了之前的操作后,停止就简单多了
- RootCmd.AddCommand(stopCmd)
- var stopCmd = &cobra.Command{
- 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")
- command := exec.Command("kill",string(strb))
- println("gonne stop")
- 执行 gonne stop 即可终止之前启动的http服务
help命令
好了,关于命令的操作讲完了,再看看cobra给的福利,
自动生成的help命令
这个不需要你做什么操作,只需要输入gonne help,相关信息已经帮你生产好了。
- appletekiMacBook-Pro:andev apple$ gonne help
- Usage:
- gonne [flags]
- gonne [command]
- Available Commands:
- help Help about any command
- start Start Gonne
- stop Stop Gonne
- version Print the version number of Gonne
- Flags:
- -h,--help help for gonne
- Use "gonne [command] --help" for more information about a command.
当然,子命令也有
- appletekiMacBook-Pro:andev apple$ gonne start -h
- Start Gonne
- gonne start [flags]
- -d,--deamon is daemon?
- 复制代码