最近希望后台启动一个go程序,发现标准库中并没有提供直接的API。于是就写一个简单的后台启动功能。通过包装syscall
的 syscall.SYS_FORK
系统调用,再按照Linux下后台程序的标准操作:设置sid,改变工作目录,关闭或重定向标准输入、输出、错误。代码就不贴了,完整代码在这里。
主要功能包括:
- start: 启动程序,将pid写入/var/run/program_name.pid 文件
- stop: 发送SIGINT信号给正在运行的程序,退出程序
- restart: 重新启动程序
- daemon: 以后台方式启动程序
下面看一个例子:
package main
import (
"github.com/Heng30/svrctl"
"time"
)
func main() {
svrctl.Run()
for true {
time.Sleep(time.Second)
}
}