zoukankan      html  css  js  c++  java
  • Go如何监听Linux系统信号

    一、什么系统信号?

    详细信息请查阅:https://www.cnblogs.com/senior-engineer/p/5979992.html
    

    二、使用go代码去监听

    • 交叉编译 (在cmd里面设置)
      • 想在Linux上运行
        • set GOOS=linux (go GOOS=windows )
        • go build ,然后得到个二进制程序
    package main
    
    import (
    	"fmt"
    	"os"
    	"os/signal"
    	"syscall"
    )
    
    func main() {
    
    	// 获取pid
    	fmt.Println("pid: ", os.Getpid())
    
    	// 管道
    	interrupt := make(chan os.Signal, 1)
    	reload := make(chan os.Signal, 1)
    
    	// 监听系统信号,一般只监听 SIGINT(中断信息相当于Ctrl + c) SIGHUP 这2种信号
    	signal.Notify(interrupt, syscall.SIGINT)
    	signal.Notify(reload, syscall.SIGHUP)
    
    	// 等待信号,读取管道
    INTERRUPT:
    	for {
    		select {
    		case <-interrupt:
    			break INTERRUPT
    		case <-reload:
    			fmt.Println("raload")
    		}
    	}
    }
    

    三、Linux上运行

    3.1、运行

    [root@prometheus test]# ll
    total 1768
    -rwxr-xr-x 1 root root 1807789 Jul  1 02:07 signal
    [root@prometheus test]# ./signal 
    pid:  23988
    

    3.2、测试

    # 1、确定成功运行
    [root@prometheus ~]# ps -ef| grep signal
    root      23988  23907  0 02:19 pts/0    00:00:00 ./signal
    root      23996  23950  0 02:19 pts/1    00:00:00 grep --color=auto signal
    
    # 2、发送一个SIGHUP信号给signal,控制台打印reload则表示成功
    [root@prometheus ~]# kill -SIGHUP 23988
    
    # 3、查看
    [root@prometheus test]# ./signal 
    pid:  23988
    raload
    
    # 4、 按键盘Ctrl + c。则是给一个SIGINT信号。就退出进程
    [root@prometheus test]# ./signal 
    pid:  23988
    raload
    ^[root@prometheus test]# 
    

    四、go执行Linux命令

    package main
    
    import (
    	"fmt"
    	"io"
    	"os"
    	"os/exec"
    )
    
    func main() {
    
    	/*
    		主要的:
    			exec.Command()  Output() cmd.ProcessState.ExitCode()
    			管道就写到shell脚本,然后go调用脚本执行
    	*/
    
    	// 查看文件路径---等价于--> which ping
    	fmt.Println(exec.LookPath("ping"))
    
    	// 第一个参数是执行的命令名称,后面的都是参数(ping baidu.com -c 5)
    	cmd := exec.Command("ping", "baidu.com", "-c", "5")
    	stdout, _ := cmd.StdoutPipe()
    
    	// 异步执行
    	cmd.Start()
    	fmt.Println("started")
    
    	io.Copy(os.Stdout, stdout)
    	cmd.Wait() // 等待进程执行结束,能让ping 实时输出
    
    	// 获取进程的退出状态码, 0 -> 是正常退出,1 -> 是错误  --> echo $?
    	fmt.Println(cmd.ProcessState.ExitCode())
    
    	// 更改进程状态码,很少用
    	os.Exit(100)
    }
    
  • 相关阅读:
    luoguP1160 队列安排 x
    luoguP3366 【模板】最小生成树 x
    cogs服务点设置(不凶,超乖) x
    codevs3269 混合背包 x
    [kuangbin带你飞]专题一 简单搜索 x
    [SWUST1744] 方格取数问题(最大流,最大独立集)
    [SWUST1738] 最小路径覆盖问题(最大流,最小路径覆盖)
    [SWUST1742] 试题库问题(最大流)
    [HDOJ5676]ztr loves lucky numbers(状压枚举,打表,二分)
    [swustoj1739] 魔术球问题 (最大流,最小路径覆盖)
  • 原文地址:https://www.cnblogs.com/hsyw/p/14957117.html
Copyright © 2011-2022 走看看