V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
herozzm
V2EX  ›  Go 编程语言

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

  •  
  •   herozzm · 2016-05-09 20:37:54 +08:00 · 3288 次点击
    这是一个创建于 3150 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我写了一个爬虫程序,希望设置成开机启动,每一次爬完成之后,隔 10 分钟运行一次,不想用计划任务啊,请问在 go 本身能实现吗?
    第 1 条附言  ·  2016-05-09 21:57:56 +08:00
    暂时用 crond ,设置间隔时间长点,其实程序抓取只需要几秒,后面会慢慢增加更多进程爬取,再想办法吧
    25 条回复    2020-12-30 16:39:09 +08:00
    niuoh
        1
    niuoh  
       2016-05-09 20:40:21 +08:00   ❤️ 1
    我不懂 go 但应该就是 sleep()之类的延迟函数把 需要脚本在后台一直运行
    herozzm
        2
    herozzm  
    OP
       2016-05-09 20:41:59 +08:00
    sleep 好像不是最佳方案
    peter999
        3
    peter999  
       2016-05-09 20:54:55 +08:00   ❤️ 1
    select 阻塞
    Zzzzzzzzz
        4
    Zzzzzzzzz  
       2016-05-09 21:08:16 +08:00   ❤️ 1
    守护进程用 init 、 supervisor 或者 upstart
    程序每隔 10 分钟跑一次就用 time.NewTicker 弄个 loop, 再配合 goroutine
    zhaohui318
        5
    zhaohui318  
       2016-05-09 21:46:52 +08:00   ❤️ 1
    为什么不想用 cron
    qyz0123321
        6
    qyz0123321  
       2016-05-09 21:48:47 +08:00   ❤️ 1
    go 有一个 cron 包,你可以看看。。。
    liujiangbei
        7
    liujiangbei  
       2016-05-09 21:50:33 +08:00   ❤️ 1
    crontab 啊。
    herozzm
        8
    herozzm  
    OP
       2016-05-09 21:51:18 +08:00
    @zhaohui318 因为爬虫需要时间,比如我设置 10 分钟执行一次,爬虫执行了 11 分钟,这就乱套了,我需要爬虫程序结束后间隔 10 分钟再运行,靠 crond 控制时间不靠谱啊
    fuxiaohei
        9
    fuxiaohei  
       2016-05-09 21:52:13 +08:00   ❤️ 1
    robfig/cron 包做定时任务, supervisor 或者 systemd 做守护进程

    其实我更推荐用系统 crontab , 10min 一次不一定需要常驻
    fuxiaohei
        10
    fuxiaohei  
       2016-05-09 21:53:52 +08:00
    @herozzm 这个就是用 sleep ,不是按照时刻走的
    chzyer
        11
    chzyer  
       2016-05-09 21:59:10 +08:00   ❤️ 1
    推荐用 crontab 加文件锁(保证只开一个进程,这样即使某次执行时间超过 10 分钟,最新被 crontab 的程序会因为文件锁的存在可以直接退出)
    ayv
        12
    ayv  
       2016-05-09 22:12:57 +08:00
    &
    yougg
        13
    yougg  
       2016-05-09 22:29:15 +08:00   ❤️ 1
    这里 main 函数最后执行 select{} 即可挂起程序.
    moro
        14
    moro  
       2016-05-09 22:58:44 +08:00   ❤️ 1
    for {
    select {
    case <-time.After(10 * time.Minute):
    //todo
    }
    }
    knightdf
        15
    knightdf  
       2016-05-09 22:59:58 +08:00   ❤️ 1
    @herozzm crontab 是可以等到上一次任务结束了才开始下一次任务的
    znoodl
        16
    znoodl  
       2016-05-09 23:06:20 +08:00 via iPhone   ❤️ 1
    systemd 可以,用 daemon 模式, enable 设置为开机启动,可以设置退出重启,重启时间间隔为 10 分钟即可
    znoodl
        17
    znoodl  
       2016-05-09 23:08:40 +08:00 via iPhone
    错了,不是 daemon 模式,就是阻塞运行的那个模式
    timothyye
        18
    timothyye  
       2016-05-09 23:28:16 +08:00
    感觉 crontab 不是更好一些……
    herozzm
        19
    herozzm  
    OP
       2016-05-10 00:03:53 +08:00
    @moro 爬虫高耗时的情况夏,个人感觉此解为最优解,多谢
    likuku
        20
    likuku  
       2016-05-10 08:23:12 +08:00
    简单啊,爬虫启动时,探测下系统中是否有自身名字的进程在运行,假若已经有就终止运行退出。
    araraloren
        21
    araraloren  
       2016-05-10 08:53:25 +08:00
    我想说的是。。 你的问题和题目的意思有点。。
    darasion
        22
    darasion  
       2016-05-10 08:56:32 +08:00
    可以读一下 apue 的相关章节。
    pierre1994
        23
    pierre1994  
       2016-05-10 12:13:48 +08:00
    supervisor ?
    jimmyye
        24
    jimmyye  
       2016-05-10 15:39:36 +08:00
    在文件或数据库记录运行状态:正在运行或者上次结束时间,设置 cron 每分钟一次,读取状态,如果正在运行或者距离上次结束时间不到 10 分钟就退出,否则继续。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2784 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:30 · PVG 08:30 · LAX 16:30 · JFK 19:30
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.