各位大佬,帮忙看一下这段代码是什么原理让 go 保持后台运行的

2021-09-01 14:11:09 +08:00
 PeterYang1996

需要做一个服务在后台运行,又不想使用第三方进程管理工具,在网上找到一段代码,试了一下可以后台运行,不明白原理

package main

import (
	"log"
	"os"
	"os/exec"
	"strconv"
	"time"
)

func main() {
	args := os.Args
	daemon := false
	for k, v := range args {
		if v == "-d" {
			daemon = true
			args[k] = ""
		}
	}

	if daemon {
		Daemonize(args...)
		return
	}

	file, err := os.OpenFile("test.txt", os.O_CREATE|os.O_RDWR, 0664)

	if err != nil {

		log.Println(err)

		return
	}

	defer file.Close()
	for {

		file.Write([]byte(strconv.Itoa((int)(time.Now().Unix())) + "\n"))

		time.Sleep(time.Second * 1)
	}
}

func Daemonize(args ...string) {
	var arg []string
	if len(args) > 1 {
		arg = args[1:]
	}
	cmd := exec.Command(args[0], arg...)
	cmd.Env = os.Environ()
	cmd.Start()
}

后台运行 ./mian -d

4353 次点击
所在节点    程序员
38 条回复
wangsongyan
2021-09-02 06:54:14 +08:00
@JustLookBy #20 你要这么说,我的回复少了两个字,没 for 循环能(一直)后台运行?
ihipop
2021-09-02 08:01:05 +08:00
@wangsongyan 能,包括但不限于 sleep channel,等方法
itfanr
2021-09-02 08:45:47 +08:00
@opsll 其实就是 linux fork 那一套
darknoll
2021-09-02 09:05:38 +08:00
@wangsongyan 你到现在还没明白这段代码的要点?
bing0
2021-09-02 09:39:14 +08:00
那么问题来了,僵尸进程会内存溢出吗?
lolizeppelin
2021-09-02 11:34:15 +08:00
找资料学把 fork setsid setuid setgid 和信号 搞清楚,别走 cmd 这种邪门歪道

实在不想学你还可以直接用 systemd 来管 但是无论怎么搞 标准做法还是要处理信号来方便退出
cenbiq
2021-09-02 12:31:34 +08:00
不太理解前面说的孤儿进程,我直接启动进程就执行 for 不能做到吗?一定要启动子进程再让自身 return 才行?
koolob
2021-09-02 12:52:16 +08:00
@cenbiq #27 直接启动然后 for 的话,此时控制台退出,程序就中断了。后台运行的目的是实现在控制台启动程序后,控制台退出,程序依然运行。
koolob
2021-09-02 12:54:51 +08:00
用这种做法还需要配套方案才行,比如保存进程号,处理各种信号,这样才能算是稳定的程序。只是本地练习的话倒是无所谓。
mxT52CRuqR6o5
2021-09-02 15:22:43 +08:00
问:水为什么会往低处流?
答:因为低处的位置比高处低。
mxT52CRuqR6o5
2021-09-02 15:29:40 +08:00
@cenbiq “后台”运行
barathrum
2021-09-02 16:07:35 +08:00
就是 double fork
ragnaroks
2021-09-02 22:42:10 +08:00
看到上面几个 for 循环我一下以为我从小学开始学的 C 路走歪了,一般都是起个线程,主线程等待子线程结束,最简单的实现
lasuar
2021-09-03 11:08:36 +08:00
套娃,多此一举。 ./main &
jianjian714
2021-09-03 14:50:31 +08:00
go 热重启算后台运行的一个完善的应用了吧
necodba
2021-09-16 19:04:34 +08:00
article-spider 里面能不能加一个并发。或者限定每一条获取数据的时间频率,另外如果首页的地址是 /article/1 , 第二页地址是 /pages?=2&type=commic&article=11,这种翻页完全改了参数的咋整
PeterYang1996
2021-09-17 16:18:53 +08:00
@necodba 你的 issue 这么提到这里了。。
PeterYang1996
2021-09-17 16:20:21 +08:00

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/799257

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX