V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
BadCat
V2EX  ›  程序员

请教,程序要 7x24 小时的运行,要写一个定时启动的任务,每天 12 点重启一下

  •  
  •   BadCat · 2017-11-17 09:32:26 +08:00 · 7430 次点击
    这是一个创建于 2597 天前的主题,其中的信息可能已经有所发展或是发生改变。

    没有这方面的经验,请问该如何下手去写

    39 条回复    2017-11-17 16:28:34 +08:00
    Gothack
        1
    Gothack  
       2017-11-17 09:36:26 +08:00 via iPhone
    crontab
    wataxiwax
        2
    wataxiwax  
       2017-11-17 09:38:11 +08:00
    可以看下 crontab 命令
    BadCat
        3
    BadCat  
    OP
       2017-11-17 09:40:07 +08:00
    @Gothack 是用 win 系统自带的那个任务计划吗?
    @wataxiwax 是用 win 系统自带的那个任务计划吗?
    xiaoz
        4
    xiaoz  
       2017-11-17 09:44:31 +08:00 via Android
    win 任务计划
    linux crontab
    ceyes
        5
    ceyes  
       2017-11-17 09:48:05 +08:00
    真正的问题是什么呢,为什么需要“每天 12 点重启一下”?
    BadCat
        6
    BadCat  
    OP
       2017-11-17 09:48:25 +08:00
    @xiaoz 好的,多谢
    calming
        7
    calming  
       2017-11-17 09:50:53 +08:00
    你要是 spring 的话直接上 Scheduled
    cy97cool
        8
    cy97cool  
       2017-11-17 09:50:58 +08:00 via Android
    定时任务即可。。。准备两个 exe,定时启动 a.exe
    a.exe 先调用 taskkill /f /im b.exe 强制结束 b.exe ,然后启动 b.exe
    b.exe 是执行任务的主体
    airyland
        9
    airyland  
       2017-11-17 09:53:15 +08:00   ❤️ 1
    楼主头像。。
    BadCat
        10
    BadCat  
    OP
       2017-11-17 09:57:26 +08:00
    @calming 我是 winform 程序。。
    @cy97cool 试试你这个,我用定时计划好像不管用
    fuyufjh
        11
    fuyufjh  
       2017-11-17 10:00:19 +08:00
    应该在醒目位置写上“ windows 环境”
    Aliencn
        12
    Aliencn  
       2017-11-17 10:01:02 +08:00
    一个批处理循环检测进程不存在就启动。
    再加一个计划任务指定时间杀进程。
    daemonghost
        13
    daemonghost  
       2017-11-17 10:26:00 +08:00
    @BadCat 为什么要定时重启,而不是做成服务监控,然后再重启呢?
    BadCat
        14
    BadCat  
    OP
       2017-11-17 10:30:13 +08:00
    @daemonghost 不是一样吗 -.=
    snip
        15
    snip  
       2017-11-17 10:43:43 +08:00
    写个批处理,先结束进程,再启动。最后用计划任务定时执行
    BadCat
        16
    BadCat  
    OP
       2017-11-17 10:51:14 +08:00
    start /max "" "d:\Debug\DVIComparison.exe"
    这么写启动有问题吗,为什么启动不了,只有手动双击 bat 才能启动的了,定时任务启动不了
    noe132
        17
    noe132  
       2017-11-17 10:52:09 +08:00 via Android
    定时任务用户非当前用户
    UnknownR
        18
    UnknownR  
       2017-11-17 11:42:58 +08:00
    windows 的 task scheduler 就能解决你的问题,定时重启, trigger 里填时间,也可以定义多个 trigger
    oott123
        19
    oott123  
       2017-11-17 11:50:08 +08:00 via Android
    装个 AlwaysUp 完美解决
    fy
        20
    fy  
       2017-11-17 11:55:47 +08:00
    等等,7x24 小时运行是这样的吗……
    hakim
        21
    hakim  
       2017-11-17 11:56:26 +08:00
    task scheduler 偶尔会出毛病,可能是我配置的有问题
    然后我用 Java 写了个脚本。。定时调用 bat 文件,bat 会先关闭程序,再启动程序
    sicifus
        22
    sicifus  
       2017-11-17 12:18:12 +08:00
    @BadCat #16 任务计划程序里给了最高权限吗?
    BadCat
        23
    BadCat  
    OP
       2017-11-17 12:35:05 +08:00
    @sicifus 改成本地用户就好了
    BadCat
        24
    BadCat  
    OP
       2017-11-17 12:36:49 +08:00
    我想写一个 windows server 来控制程序 重启,不知道能行吗
    time.Interval 只能给间隔时间,好像不能控制在几点啊
    jzj
        25
    jzj  
       2017-11-17 12:38:11 +08:00
    写个服务端 service 用定时器不就 O 了
    BadCat
        26
    BadCat  
    OP
       2017-11-17 12:38:17 +08:00
    @fy 不是,是程序要 7x24 小时的运行,在后台做运算,但怕承受不了压力 崩溃掉,所以打算在凌晨重启一下
    pkaq
        27
    pkaq  
       2017-11-17 12:55:24 +08:00
    找个员工 然后把他发到太平洋某个岛上 每天晚上十二点必须起来输入 4815162342
    lsido
        28
    lsido  
       2017-11-17 13:00:57 +08:00
    crontab 第一个脚本 每晚 12 点 kill 你的程序

    crontab 第二个脚本

    #!/bin/sh
    Tag=`ps -ef|grep '程序名'|grep -v grep|wc -l|awk '{printf $1"\n"}'`
    if [ $Tag = 0 ]
    then
    echo '未检测到程序,正在重启...'
    启动命令
    fi
    BadCat
        29
    BadCat  
    OP
       2017-11-17 13:16:27 +08:00
    emmmm 批处理的已经写出来了,添加到任务计划里了
    %1 start "" mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit
    taskkill /im DVIComparison.exe /f
    @echo off
    echo
    ping localhost -n 10 > nul
    echo
    start /max "" "d:\Debug\DVIComparison.exe"

    现在是想写个服务来实现这个功能,不知道怎么写
    notreami
        30
    notreami  
       2017-11-17 13:18:20 +08:00
    为啥要重启呢?为啥没有集群呢?为啥没有分布式定时任务呢?
    cabing
        31
    cabing  
       2017-11-17 13:37:27 +08:00
    为啥要重启呢?
    BadCat
        32
    BadCat  
    OP
       2017-11-17 13:38:34 +08:00
    ??????
    都是只看标题进来就问 为啥要重启??
    forcecharlie
        33
    forcecharlie  
       2017-11-17 14:16:56 +08:00
    大多数语言的网络框架都有定时器,当然也可以用系统 API 或者系统调用, 比如 Boost Asio 就有 steady_timer, async_wait 等到时间到了就执行,crontab 实际上是不断的 sleep 然后唤醒后检查任务队列里面的任务,执行对应的命令。如果是服务程序,使用了网络框架完全可以使用内置的定时器区执行任务的。

    源码:
    https://github.com/systemd-cron/crontab
    860670496
        34
    860670496  
       2017-11-17 15:04:10 +08:00
    @pkaq #27 哈哈哈哈而且一定要用有那种老式翻页计时器
    CFO
        35
    CFO  
       2017-11-17 15:29:52 +08:00 via Android
    这是 7x24 小时?重启不得花好几秒吗?那么这几秒哪去了?
    续了?
    lonelygo
        36
    lonelygo  
       2017-11-17 15:47:05 +08:00
    @airyland
    好巧,我们的关注点一样。
    loveCoding
        37
    loveCoding  
       2017-11-17 15:54:37 +08:00
    设计 cron 的人真是个人才... 太灵活好用了.
    Theo14
        38
    Theo14  
       2017-11-17 16:22:26 +08:00
    考虑做成 windows 服务吧,在服务里管理,记得服务的属性里面可以设置。
    如果了解 supervisord 的话,你看下这个 https://stackoverflow.com/questions/7629813/is-there-windows-analog-to-supervisord
    BadCat
        39
    BadCat  
    OP
       2017-11-17 16:28:34 +08:00
    @Theo14 有试着做了一下,但是发现调用不了 winform 程序,而且要给定时间去调用就有些复杂 ,timer 只能设置多少 ms 延迟。没写过服务 突然上手还有一些难的
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3608 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 10:23 · PVG 18:23 · LAX 02:23 · JFK 05:23
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.