The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
herozzm

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

  •  
  •   herozzm · May 9, 2016 · 3995 views
    This topic created in 3656 days ago, the information mentioned may be changed or developed.
    我写了一个爬虫程序,希望设置成开机启动,每一次爬完成之后,隔 10 分钟运行一次,不想用计划任务啊,请问在 go 本身能实现吗?
    Supplement 1  ·  May 9, 2016
    暂时用 crond ,设置间隔时间长点,其实程序抓取只需要几秒,后面会慢慢增加更多进程爬取,再想办法吧
    25 replies    2020-12-30 16:39:09 +08:00
    niuoh
        1
    niuoh  
       May 9, 2016   ❤️ 1
    我不懂 go 但应该就是 sleep()之类的延迟函数把 需要脚本在后台一直运行
    herozzm
        2
    herozzm  
    OP
       May 9, 2016
    sleep 好像不是最佳方案
    peter999
        3
    peter999  
       May 9, 2016   ❤️ 1
    select 阻塞
    Zzzzzzzzz
        4
    Zzzzzzzzz  
       May 9, 2016   ❤️ 1
    守护进程用 init 、 supervisor 或者 upstart
    程序每隔 10 分钟跑一次就用 time.NewTicker 弄个 loop, 再配合 goroutine
    bqbkbz
        5
    bqbkbz  
       May 9, 2016   ❤️ 1
    为什么不想用 cron
    qyz0123321
        6
    qyz0123321  
       May 9, 2016   ❤️ 1
    go 有一个 cron 包,你可以看看。。。
    liujiangbei
        7
    liujiangbei  
       May 9, 2016   ❤️ 1
    crontab 啊。
    herozzm
        8
    herozzm  
    OP
       May 9, 2016
    @zhaohui318 因为爬虫需要时间,比如我设置 10 分钟执行一次,爬虫执行了 11 分钟,这就乱套了,我需要爬虫程序结束后间隔 10 分钟再运行,靠 crond 控制时间不靠谱啊
    fuxiaohei
        9
    fuxiaohei  
       May 9, 2016   ❤️ 1
    robfig/cron 包做定时任务, supervisor 或者 systemd 做守护进程

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