Golang Go语言中程序怎么常驻进程(或者叫守护进程)中(非 web 应用)

发布于 1周前 作者 h691938207 来自 Go语言

我写了一个爬虫程序,希望设置成开机启动,每一次爬完成之后,隔 10 分钟运行一次,不想用计划任务啊,请问在 go 本身能实现吗?
Golang Go语言中程序怎么常驻进程(或者叫守护进程)中(非 web 应用)

25 回复

我不懂 go 但应该就是 sleep()之类的延迟函数把 需要脚本在后台一直运行

更多关于Golang Go语言中程序怎么常驻进程(或者叫守护进程)中(非 web 应用)的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


sleep 好像不是最佳方案

select 阻塞

守护进程用 init 、 supervisor 或者 upstart
程序每隔 10 分钟跑一次就用 time.NewTicker 弄个 loop, 再配合 goroutine

为什么不想用 cron

go 有一个 cron 包,你可以看看。。。

crontab 啊。

因为爬虫需要时间,比如我设置 10 分钟执行一次,爬虫执行了 11 分钟,这就乱套了,我需要爬虫程序结束后间隔 10 分钟再运行,靠 crond 控制时间不靠谱啊

robfig/cron 包做定时任务, supervisor 或者 systemd 做守护进程

其实我更推荐用系统 crontab , 10min 一次不一定需要常驻

这个就是用 sleep ,不是按照时刻走的

推荐用 crontab 加文件锁(保证只开一个进程,这样即使某次执行时间超过 10 分钟,最新被 crontab 的程序会因为文件锁的存在可以直接退出)

这里 main 函数最后执行 select{} 即可挂起程序.

for {
select {
case <-time.After(10 * time.Minute):
//todo
}
}

crontab 是可以等到上一次任务结束了才开始下一次任务的

systemd 可以,用 daemon 模式, enable 设置为开机启动,可以设置退出重启,重启时间间隔为 10 分钟即可

错了,不是 daemon 模式,就是阻塞运行的那个模式

感觉 crontab 不是更好一些……

爬虫高耗时的情况夏,个人感觉此解为最优解,多谢

简单啊,爬虫启动时,探测下系统中是否有自身名字的进程在运行,假若已经有就终止运行退出。

我想说的是。。 你的问题和题目的意思有点。。

可以读一下 apue 的相关章节。

supervisor ?

在文件或数据库记录运行状态:正在运行或者上次结束时间,设置 cron 每分钟一次,读取状态,如果正在运行或者距离上次结束时间不到 10 分钟就退出,否则继续。

在Go语言中,将程序设置为常驻进程(守护进程)通常涉及几个关键步骤,特别是当你编写的是一个非Web应用时。以下是一些实现这一目标的建议:

  1. 脱离终端:使用os.Exec重新执行程序,并传递适当的参数来确保新进程不再与原始终端关联。这通常通过syscall.Setsid在新进程中创建一个新的会话,并使其成为会话领导,从而脱离控制终端。

  2. 忽略SIGHUP信号:守护进程通常需要忽略挂起信号(SIGHUP),因为该信号通常与终端关闭相关联。

  3. 重定向标准I/O:将标准输入、输出和错误输出重定向到/dev/null或日志文件,以避免它们与终端交互。

  4. 确保进程在后台运行:在启动程序时,确保它在后台运行,这通常意味着在shell中使用&符号或在代码中适当处理。

  5. 使用系统工具:在某些系统上,可以使用nohupsystemd等工具来管理和启动守护进程。这些工具提供了额外的功能,如日志记录、重启策略等。

  6. 编写服务管理脚本:对于复杂的守护进程管理,可以编写自定义的服务管理脚本或使用现有的服务管理工具(如systemd服务单元文件)来确保程序在系统启动时自动启动并在崩溃时自动重启。

通过以上步骤,你可以将Go程序配置为在系统中作为常驻守护进程运行,即使它不是Web应用。

回到顶部