一、什么系统信号?
详细信息请查阅: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)
}