golang实现daemon守护进程,支持goroutine和系统信号监听

作者: aries 分类: Go 发布时间: 2019-12-22 19:02 ė 1780次浏览 6 0评论

网上看了好多解决方案,要不就是不支持goroutine, 要不就是不支持系统信号监听。自己尝试了一下,算是可以是满足需求了

package main

import (
"os"
"fmt"
"os/signal"
"syscall"
"time"
"log"
"os/exec"
)
func init() {
if os.Getppid() != 1{
cmd := exec.Command(os.Args[0], os.Args[1:]...)
cmd.Start()
os.Exit(0)
}

<span class="highlight-c1">// 监听系统信号

go func() {
_c := make(chan os.Signal, 1)
signal.Notify(_c, os.Interrupt, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT, syscall.SIGKILL, syscall.SIGTSTP)
msg := <- _c
log.Println(msg)
os.Exit(0)
}()
}

func main() {

<span class="highlight-k">go</span> <span class="highlight-kd">func</span><span class="highlight-p">(){</span>
    <span class="highlight-nx">fp</span><span class="highlight-p">,</span> <span class="highlight-nx">_</span> <span class="highlight-o">:=</span> <span class="highlight-nx">os</span><span class="highlight-p">.</span><span class="highlight-nf">OpenFile</span><span class="highlight-p">(</span><span class="highlight-s">&#34;log&#34;</span><span class="highlight-p">,</span> <span class="highlight-nx">os</span><span class="highlight-p">.</span><span class="highlight-nx">O_WRONLY</span><span class="highlight-p">|</span><span class="highlight-nx">os</span><span class="highlight-p">.</span><span class="highlight-nx">O_CREATE</span><span class="highlight-p">|</span><span class="highlight-nx">os</span><span class="highlight-p">.</span><span class="highlight-nx">O_APPEND</span><span class="highlight-p">,</span> <span class="highlight-mo">0644</span><span class="highlight-p">)</span>
    <span class="highlight-nx">log</span><span class="highlight-p">.</span><span class="highlight-nf">SetOutput</span><span class="highlight-p">(</span><span class="highlight-nx">fp</span><span class="highlight-p">)</span>
    <span class="highlight-k">for</span><span class="highlight-p">{</span>
        <span class="highlight-nx">log</span><span class="highlight-p">.</span><span class="highlight-nf">Println</span><span class="highlight-p">(</span><span class="highlight-nx">fmt</span><span class="highlight-p">.</span><span class="highlight-nf">Sprint</span><span class="highlight-p">(</span><span class="highlight-s">&#34;hello &#34;</span><span class="highlight-p">,</span> <span class="highlight-nx">os</span><span class="highlight-p">.</span><span class="highlight-nf">Getpid</span><span class="highlight-p">()))</span>
        <span class="highlight-nx">time</span><span class="highlight-p">.</span><span class="highlight-nf">Sleep</span><span class="highlight-p">(</span><span class="highlight-nx">time</span><span class="highlight-p">.</span><span class="highlight-nx">Second</span> <span class="highlight-o">*</span> <span class="highlight-mi">5</span><span class="highlight-p">)</span>
    <span class="highlight-p">}</span>
<span class="highlight-p">}()</span>

<span class="highlight-k">for</span><span class="highlight-p">{</span>
    <span class="highlight-nx">time</span><span class="highlight-p">.</span><span class="highlight-nf">Sleep</span><span class="highlight-p">(</span><span class="highlight-nx">time</span><span class="highlight-p">.</span><span class="highlight-nx">Second</span> <span class="highlight-o">*</span> <span class="highlight-mi">1000</span><span class="highlight-p">)</span>
<span class="highlight-p">}</span>

}

来源:https://www.cnblogs.com/walkerwang731/p/10825608.html

0 godaemon
换一个
暂无评论
Ɣ回顶部