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

我写了一个爬虫程序,希望设置成开机启动,每一次爬完成之后,隔 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应用。

回到顶部