go 程序怎么常驻进程(或者叫守护进程)中(非 web 应用) - V2EX
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 3709 次点击
    这是一个创建于 3486 天前的主题,其中的信息可能已经有所发展或是发生改变。
    我写了一个爬虫程序,希望设置成开机启动,每一次爬完成之后,隔 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     Solana     4494 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 04:03 PVG 12:03 LAX 20:03 JFK 23:03
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86