=Start=
缘由:
以后可能要用Golang语言写一个daemon程序(守护进程)运行在服务器上,以进行一些信息收集的工作。之前只是简单知道什么是守护进程,但对于一些细节以及该如何用Golang进行编写都不太清楚,所以需要先学习、准备一下。
正文:
参考解答:
……待补充……
package main import ( "fmt" "log" "os" "os/signal" "runtime" "syscall" "time" ) func daemon(nochdir, noclose int) int { var ret, ret2 uintptr var err syscall.Errno darwin := runtime.GOOS == "darwin" // already a daemon if syscall.Getppid() == 1 { return 0 } // fork off the parent process ret, ret2, err = syscall.RawSyscall(syscall.SYS_FORK, 0, 0, 0) if err != 0 { return -1 } // failure if ret2 < 0 { os.Exit(-1) } // handle exception for darwin if darwin && ret2 == 1 { ret = 0 } // if we got a good PID, then we call exit the parent process. if ret > 0 { os.Exit(0) } /* Change the file mode mask */ _ = syscall.Umask(0) // create a new SID for the child process s_ret, s_errno := syscall.Setsid() if s_errno != nil { log.Printf("Error: syscall.Setsid errno: %d", s_errno) } if s_ret < 0 { return -1 } if nochdir == 0 { os.Chdir("/") } if noclose == 0 { f, e := os.OpenFile("/dev/null", os.O_RDWR, 0) if e == nil { fd := f.Fd() syscall.Dup2(int(fd), int(os.Stdin.Fd())) syscall.Dup2(int(fd), int(os.Stdout.Fd())) syscall.Dup2(int(fd), int(os.Stderr.Fd())) } } return 0 } func main() { daemon(0, 1) for { fmt.Println("hello") time.Sleep(1 * time.Second) } }
……待补充……
参考链接:
- Go到目前还没有解决成为守护进程(Daemonize)的问题吧?各位是怎么解决的?
https://segmentfault.com/q/1010000000699471 - Golang创建daemon程序
http://shanks.leanote.com/post/Go%E5%88%9B%E5%BB%BAdaemon%E7%A8%8B%E5%BA%8F - Go语言daemon启动的解决方法.linux平台
http://blog.csdn.net/fyxichen/article/details/50541449 - How to create a daemon process in Golang?
http://stackoverflow.com/questions/23736046/how-to-create-a-daemon-process-in-golang - https://github.com/sevlyar/go-daemon
https://github.com/takama/daemon
https://github.com/VividCortex/godaemon
https://github.com/fiorix/go-daemon - =
- How do I get my Golang web server to run in the background?
http://stackoverflow.com/questions/12486691/how-do-i-get-my-golang-web-server-to-run-in-the-background - supervisor运行golang守护进程
http://www.01happy.com/supervisor-golang-daemon/ - 用golang启动一个daemon
http://www.cnblogs.com/toby/p/3262516.html
=END=
《 “Linux下守护进程的Golang语言实现” 》 有 6 条评论
A daemon package for use with Go (golang) services with no dependencies. 一个没有任何依赖的Golang守护进程package
https://github.com/takama/daemon
便于用Golang写daemon程序的库(A library for writing system daemons in golang.)
https://github.com/sevlyar/go-daemon
gops 工作原理
https://phpor.net/blog/post/6760
https://github.com/google/gops
`
gops用来查看系统中存在的go进程。(A tool to list and diagnose Go processes currently running on your system.)
那么,gops是如何找到所有go进程,又是如何识别出来agent的呢?
1.拿到所有的系统进程
2.分析进程文件可以检测是否go进程
3.在进程的用户目录下查找 .config/gops/{$pid} 文件,如果存在,就认为是有内置了agent了,该文件中存放的是agentlisten的端口号
`
将Golang程序在主流系统上以服务的形式运行(Run go programs as a service on major platforms.)
https://github.com/kardianos/service
goroutine 切换的时候发生了什么?
https://jiajunhuang.com/articles/2018_03_29-goroutine_schedule.md.html
Golang中实现典型的fork调用
https://jiajunhuang.com/articles/2018_03_08-golang_fork.md.html
【漏洞分析】Go语言任意代码执行漏洞 CVE-2018-6574
http://blog.nsfocus.net/cve-2018-6574/
https://paper.tuisec.win/detail/7a026c5e924692a
`
什么是Go语言?
CVE-2018-6574 漏洞分析
参看CVE公告,这个漏洞是由于在源码编译时,未禁止 “-fplugin=” 这类的参数导致在使用gcc/clang编译时产生代码执行。
CVE-2018-6574 防御修复
只允许指定的编译链接选项代入gcc执行,其他未经允许的都会被禁止。
总结
`
golang 后台服务设计精要
http://litang.me/post/golang-server-design/
`
守护进程
优雅的结束进程
响应信号
等待所有协程退出
goroutine 生命期管理
数据库操作与 ORM
标准库中的数据库操作接口
ORM
HTTP 服务
标准库 net/http 包
httprouter
middleware
gin
总结
参考资料
`