热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

原文链接+++title”golang进阶(三)——后台进程的启动和停止”date”2017-10-12”tags[“golang”,”cobra”]catego

原文链接


+++ 
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


推荐阅读
  • 本文介绍了一种轻巧方便的工具——集算器,通过使用集算器可以将文本日志变成结构化数据,然后可以使用SQL式查询。集算器利用集算语言的优点,将日志内容结构化为数据表结构,SPL支持直接对结构化的文件进行SQL查询,不再需要安装配置第三方数据库软件。本文还详细介绍了具体的实施过程。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 本文介绍了一个在线急等问题解决方法,即如何统计数据库中某个字段下的所有数据,并将结果显示在文本框里。作者提到了自己是一个菜鸟,希望能够得到帮助。作者使用的是ACCESS数据库,并且给出了一个例子,希望得到的结果是560。作者还提到自己已经尝试了使用"select sum(字段2) from 表名"的语句,得到的结果是650,但不知道如何得到560。希望能够得到解决方案。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 如何查询zone下的表的信息
    本文介绍了如何通过TcaplusDB知识库查询zone下的表的信息。包括请求地址、GET请求参数说明、返回参数说明等内容。通过curl方法发起请求,并提供了请求示例。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了一个Java猜拳小游戏的代码,通过使用Scanner类获取用户输入的拳的数字,并随机生成计算机的拳,然后判断胜负。该游戏可以选择剪刀、石头、布三种拳,通过比较两者的拳来决定胜负。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 如何使用Java获取服务器硬件信息和磁盘负载率
    本文介绍了使用Java编程语言获取服务器硬件信息和磁盘负载率的方法。首先在远程服务器上搭建一个支持服务端语言的HTTP服务,并获取服务器的磁盘信息,并将结果输出。然后在本地使用JS编写一个AJAX脚本,远程请求服务端的程序,得到结果并展示给用户。其中还介绍了如何提取硬盘序列号的方法。 ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 本文介绍了在Java中gt、gtgt、gtgtgt和lt之间的区别。通过解释符号的含义和使用例子,帮助读者理解这些符号在二进制表示和移位操作中的作用。同时,文章还提到了负数的补码表示和移位操作的限制。 ... [详细]
  • 本文介绍了RPC框架Thrift的安装环境变量配置与第一个实例,讲解了RPC的概念以及如何解决跨语言、c++客户端、web服务端、远程调用等需求。Thrift开发方便上手快,性能和稳定性也不错,适合初学者学习和使用。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
author-avatar
暗恋达志_227
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有