Go语言daemon启动的解决方法.linux平台

原创 2016年01月19日 11:49:06
1、使用nohup ./commond & 这种方法最简单.
2、这种方法可以使用信号.
<pre name="code" class="html">package main

import (
	"fmt"
	"os"
	"os/signal"
	"syscall"
	"time"
)

func main() {
	if os.Getppid() != 1 {
		args := append([]string{os.Args[0]}, os.Args[1:]...)
		os.StartProcess(os.Args[0], args, &os.ProcAttr{Files: []*os.File{os.Stdin, os.Stdout, os.Stderr}})
		return
	}
	go func() {
		var c chan os.Signal = make(chan os.Signal, 1)
		go signal.Notify(c, os.Kill, os.Interrupt, syscall.SIGHUP, syscall.SIGUSR2)
		File, err := os.Create("/tmp/收到的信号.")
		defer File.Close()
		for {
			s := <-c
			File.WriteString(s.String())
		}
	}()
	F, err := os.Create("/tmp/log")
	if err != nil {
		fmt.Println(err)
		return
	}
	defer F.Close()
	for {
		fmt.Fprintln(F, "Hello World")
		time.Sleep(3e9)
	}
}


3、这种方法比较底层,但是不能使用信号.
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)
	}
}

版权声明:本文为博主原创文章,交流邮箱czxichen@163.com,交流群:259693140(此群不允许闲聊)

Go语言daemon启动本身.实现

package main import (     "fmt"     "log"     "net/http"     "os"     "os/signal"     "sysc...
  • fyxichen
  • fyxichen
  • 2016年01月20日 16:55
  • 2198

go lang 后台(守护进程)运行(daemon)

引用:https://bitbucket.org/kardianos/service service will install / un-install, start / stop,...
  • xiunai78
  • xiunai78
  • 2014年11月01日 11:55
  • 5754

关于Go语言daemon启动的方法.

昨天搞了个文件共享的小程序,遇见了意见蛋疼的事,就是启动之后终端不能关闭,不然程序也会随着关闭. 我的解决方法: nohup ./httpserver & nohup这个命令可以把程序放后...
  • fyxichen
  • fyxichen
  • 2015年07月14日 10:15
  • 1264

golang 另类方法后台运行程序(linux、windows)

程序后台运行的另类方法,支持windows、linux、...
  • CodyGuo
  • CodyGuo
  • 2016年12月30日 10:11
  • 2242

linux下go安装

1、准备go安装包 https://golang.org/doc/install?download=go1.8.3.linux-amd64.tar.gz 2、选择安装路径 由于默认的go路径,...
  • WuxCSDN
  • WuxCSDN
  • 2017年06月05日 23:25
  • 2373

Linux上go的安装配置以及简单使用

go语言在linux上的安装的使用
  • u011054678
  • u011054678
  • 2017年06月06日 13:55
  • 5963

golang 守护进程(daemon)

package main import ( "fmt" "log" "os" "runtime" "syscall" "time" ) func...
  • u013834131
  • u013834131
  • 2015年01月07日 14:53
  • 2794

[Golang]OS系统调用浅析

上回讲Goroutine状态变换的时候,遗留了一部分关于Syscall处理的内容,这次打算把Go语言对Syscall的处理机制系统的总结一下,放在今天这篇文章中。Go 语言库对Syscall的封装我们...
  • abv123456789
  • abv123456789
  • 2015年12月11日 15:26
  • 4595

Golang 系统调用Syscall

Go 系统调用最近在研究go语言,发现go语言系统调用源码只有调用函数的定义,没有指导文档,网上也没有相关文档的说明,自己稍微研究了一下,不对的地方欢迎指教 go源码中关于系统调用的定义如下:fun...
  • u011211976
  • u011211976
  • 2017年12月22日 14:51
  • 272

如何运行一个golang程序为守护进程

http://www.hiceon.com/topic/how-to-start-a-golang-program-as-a-daemon/ 安装daemonize ...
  • leonpengweicn
  • leonpengweicn
  • 2015年01月07日 16:12
  • 1899
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Go语言daemon启动的解决方法.linux平台
举报原因:
原因补充:

(最多只允许输入30个字)