go 程序怎么常驻进程(或者叫守护进程)中(非 web 应用)

2016-05-09 20:37:54 +08:00
 herozzm
我写了一个爬虫程序,希望设置成开机启动,每一次爬完成之后,隔 10 分钟运行一次,不想用计划任务啊,请问在 go 本身能实现吗?
3115 次点击
所在节点    Go 编程语言
25 条回复
niuoh
2016-05-09 20:40:21 +08:00
我不懂 go 但应该就是 sleep()之类的延迟函数把 需要脚本在后台一直运行
herozzm
2016-05-09 20:41:59 +08:00
sleep 好像不是最佳方案
peter999
2016-05-09 20:54:55 +08:00
select 阻塞
Zzzzzzzzz
2016-05-09 21:08:16 +08:00
守护进程用 init 、 supervisor 或者 upstart
程序每隔 10 分钟跑一次就用 time.NewTicker 弄个 loop, 再配合 goroutine
zhaohui318
2016-05-09 21:46:52 +08:00
为什么不想用 cron
qyz0123321
2016-05-09 21:48:47 +08:00
go 有一个 cron 包,你可以看看。。。
liujiangbei
2016-05-09 21:50:33 +08:00
crontab 啊。
herozzm
2016-05-09 21:51:18 +08:00
@zhaohui318 因为爬虫需要时间,比如我设置 10 分钟执行一次,爬虫执行了 11 分钟,这就乱套了,我需要爬虫程序结束后间隔 10 分钟再运行,靠 crond 控制时间不靠谱啊
fuxiaohei
2016-05-09 21:52:13 +08:00
robfig/cron 包做定时任务, supervisor 或者 systemd 做守护进程

其实我更推荐用系统 crontab , 10min 一次不一定需要常驻
fuxiaohei
2016-05-09 21:53:52 +08:00
@herozzm 这个就是用 sleep ,不是按照时刻走的
chzyer
2016-05-09 21:59:10 +08:00
推荐用 crontab 加文件锁(保证只开一个进程,这样即使某次执行时间超过 10 分钟,最新被 crontab 的程序会因为文件锁的存在可以直接退出)
ayv
2016-05-09 22:12:57 +08:00
&
yougg
2016-05-09 22:29:15 +08:00
这里 main 函数最后执行 select{} 即可挂起程序.
moro
2016-05-09 22:58:44 +08:00
for {
select {
case <-time.After(10 * time.Minute):
//todo
}
}
knightdf
2016-05-09 22:59:58 +08:00
@herozzm crontab 是可以等到上一次任务结束了才开始下一次任务的
znoodl
2016-05-09 23:06:20 +08:00
systemd 可以,用 daemon 模式, enable 设置为开机启动,可以设置退出重启,重启时间间隔为 10 分钟即可
znoodl
2016-05-09 23:08:40 +08:00
错了,不是 daemon 模式,就是阻塞运行的那个模式
timothyye
2016-05-09 23:28:16 +08:00
感觉 crontab 不是更好一些……
herozzm
2016-05-10 00:03:53 +08:00
@moro 爬虫高耗时的情况夏,个人感觉此解为最优解,多谢
likuku
2016-05-10 08:23:12 +08:00
简单啊,爬虫启动时,探测下系统中是否有自身名字的进程在运行,假若已经有就终止运行退出。

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

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

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

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

© 2021 V2EX