Golang Go语言中程序怎么常驻进程(或者叫守护进程)中(非 web 应用)
我写了一个爬虫程序,希望设置成开机启动,每一次爬完成之后,隔 10 分钟运行一次,不想用计划任务啊,请问在 go 本身能实现吗?
Golang Go语言中程序怎么常驻进程(或者叫守护进程)中(非 web 应用)
我不懂 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 分钟即可
感觉 crontab 不是更好一些……
爬虫高耗时的情况夏,个人感觉此解为最优解,多谢
简单啊,爬虫启动时,探测下系统中是否有自身名字的进程在运行,假若已经有就终止运行退出。
我想说的是。。 你的问题和题目的意思有点。。
supervisor ?
在文件或数据库记录运行状态:正在运行或者上次结束时间,设置 cron 每分钟一次,读取状态,如果正在运行或者距离上次结束时间不到 10 分钟就退出,否则继续。
在Go语言中,将程序设置为常驻进程(守护进程)通常涉及几个关键步骤,特别是当你编写的是一个非Web应用时。以下是一些实现这一目标的建议:
-
脱离终端:使用
os.Exec
重新执行程序,并传递适当的参数来确保新进程不再与原始终端关联。这通常通过syscall.Setsid
在新进程中创建一个新的会话,并使其成为会话领导,从而脱离控制终端。 -
忽略SIGHUP信号:守护进程通常需要忽略挂起信号(SIGHUP),因为该信号通常与终端关闭相关联。
-
重定向标准I/O:将标准输入、输出和错误输出重定向到
/dev/null
或日志文件,以避免它们与终端交互。 -
确保进程在后台运行:在启动程序时,确保它在后台运行,这通常意味着在shell中使用
&
符号或在代码中适当处理。 -
使用系统工具:在某些系统上,可以使用
nohup
或systemd
等工具来管理和启动守护进程。这些工具提供了额外的功能,如日志记录、重启策略等。 -
编写服务管理脚本:对于复杂的守护进程管理,可以编写自定义的服务管理脚本或使用现有的服务管理工具(如
systemd
服务单元文件)来确保程序在系统启动时自动启动并在崩溃时自动重启。
通过以上步骤,你可以将Go程序配置为在系统中作为常驻守护进程运行,即使它不是Web应用。