• 请不要在回答技术问题时复制粘贴 AI 生成的内容
BadCat
V2EX  ›  程序员

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

  •  
  •   BadCat · Nov 17, 2017 · 8185 views
    This topic created in 3115 days ago, the information mentioned may be changed or developed.

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

    39 replies    2017-11-17 16:28:34 +08:00
    Gothack
        1
    Gothack  
       Nov 17, 2017 via iPhone
    crontab
    wataxiwax
        2
    wataxiwax  
       Nov 17, 2017
    可以看下 crontab 命令
    BadCat
        3
    BadCat  
    OP
       Nov 17, 2017
    @Gothack 是用 win 系统自带的那个任务计划吗?
    @wataxiwax 是用 win 系统自带的那个任务计划吗?
    xiaoz
        4
    xiaoz  
       Nov 17, 2017 via Android
    win 任务计划
    linux crontab
    ceyes
        5
    ceyes  
       Nov 17, 2017
    真正的问题是什么呢,为什么需要“每天 12 点重启一下”?
    BadCat
        6
    BadCat  
    OP
       Nov 17, 2017
    @xiaoz 好的,多谢
    calming
        7
    calming  
       Nov 17, 2017
    你要是 spring 的话直接上 Scheduled
    mYYnSmiTEQWcCwAr
        8
    mYYnSmiTEQWcCwAr  
       Nov 17, 2017 via Android
    定时任务即可。。。准备两个 exe,定时启动 a.exe
    a.exe 先调用 taskkill /f /im b.exe 强制结束 b.exe ,然后启动 b.exe
    b.exe 是执行任务的主体
    airyland
        9
    airyland  
       Nov 17, 2017   ❤️ 1
    楼主头像。。
    BadCat
        10
    BadCat  
    OP
       Nov 17, 2017
    @calming 我是 winform 程序。。
    @cy97cool 试试你这个,我用定时计划好像不管用
    fuyufjh
        11
    fuyufjh  
       Nov 17, 2017
    应该在醒目位置写上“ windows 环境”
    Aliencn
        12
    Aliencn  
       Nov 17, 2017
    一个批处理循环检测进程不存在就启动。
    再加一个计划任务指定时间杀进程。
    daemonghost
        13
    daemonghost  
       Nov 17, 2017
    @BadCat 为什么要定时重启,而不是做成服务监控,然后再重启呢?
    BadCat
        14
    BadCat  
    OP
       Nov 17, 2017
    @daemonghost 不是一样吗 -.=
    snip
        15
    snip  
       Nov 17, 2017
    写个批处理,先结束进程,再启动。最后用计划任务定时执行
    BadCat
        16
    BadCat  
    OP
       Nov 17, 2017
    start /max "" "d:\Debug\DVIComparison.exe"
    这么写启动有问题吗,为什么启动不了,只有手动双击 bat 才能启动的了,定时任务启动不了
    noe132
        17
    noe132  
       Nov 17, 2017 via Android
    定时任务用户非当前用户
    UnknownR
        18
    UnknownR  
       Nov 17, 2017
    windows 的 task scheduler 就能解决你的问题,定时重启, trigger 里填时间,也可以定义多个 trigger
    oott123
        19
    oott123  
       Nov 17, 2017 via Android
    装个 AlwaysUp 完美解决
    fy
        20
    fy  
       Nov 17, 2017
    等等,7x24 小时运行是这样的吗……
    hakim
        21
    hakim  
       Nov 17, 2017
    task scheduler 偶尔会出毛病,可能是我配置的有问题
    然后我用 Java 写了个脚本。。定时调用 bat 文件,bat 会先关闭程序,再启动程序
    sicifus
        22
    sicifus  
       Nov 17, 2017
    @BadCat #16 任务计划程序里给了最高权限吗?
    BadCat
        23
    BadCat  
    OP
       Nov 17, 2017
    @sicifus 改成本地用户就好了
    BadCat
        24
    BadCat  
    OP
       Nov 17, 2017
    我想写一个 windows server 来控制程序 重启,不知道能行吗
    time.Interval 只能给间隔时间,好像不能控制在几点啊
    jzj
        25
    jzj  
       Nov 17, 2017
    写个服务端 service 用定时器不就 O 了
    BadCat
        26
    BadCat  
    OP
       Nov 17, 2017
    @fy 不是,是程序要 7x24 小时的运行,在后台做运算,但怕承受不了压力 崩溃掉,所以打算在凌晨重启一下
    pkaq
        27
    pkaq  
       Nov 17, 2017
    找个员工 然后把他发到太平洋某个岛上 每天晚上十二点必须起来输入 4815162342
    lsido
        28
    lsido  
       Nov 17, 2017
    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
       Nov 17, 2017
    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  
       Nov 17, 2017
    为啥要重启呢?为啥没有集群呢?为啥没有分布式定时任务呢?
    cabing
        31
    cabing  
       Nov 17, 2017
    为啥要重启呢?
    BadCat
        32
    BadCat  
    OP
       Nov 17, 2017
    ??????
    都是只看标题进来就问 为啥要重启??
    forcecharlie
        33
    forcecharlie  
       Nov 17, 2017
    大多数语言的网络框架都有定时器,当然也可以用系统 API 或者系统调用, 比如 Boost Asio 就有 steady_timer, async_wait 等到时间到了就执行,crontab 实际上是不断的 sleep 然后唤醒后检查任务队列里面的任务,执行对应的命令。如果是服务程序,使用了网络框架完全可以使用内置的定时器区执行任务的。

    源码:
    https://github.com/systemd-cron/crontab
    860670496
        34
    860670496  
       Nov 17, 2017
    @pkaq #27 哈哈哈哈而且一定要用有那种老式翻页计时器
    CFO
        35
    CFO  
       Nov 17, 2017 via Android
    这是 7x24 小时?重启不得花好几秒吗?那么这几秒哪去了?
    续了?
    lonelygo
        36
    lonelygo  
       Nov 17, 2017
    @airyland
    好巧,我们的关注点一样。
    loveCoding
        37
    loveCoding  
       Nov 17, 2017
    设计 cron 的人真是个人才... 太灵活好用了.
    Theo14
        38
    Theo14  
       Nov 17, 2017
    考虑做成 windows 服务吧,在服务里管理,记得服务的属性里面可以设置。
    如果了解 supervisord 的话,你看下这个 https://stackoverflow.com/questions/7629813/is-there-windows-analog-to-supervisord
    BadCat
        39
    BadCat  
    OP
       Nov 17, 2017
    @Theo14 有试着做了一下,但是发现调用不了 winform 程序,而且要给定时间去调用就有些复杂 ,timer 只能设置多少 ms 延迟。没写过服务 突然上手还有一些难的
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1194 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 86ms · UTC 17:40 · PVG 01:40 · LAX 10:40 · JFK 13:40
    ♥ Do have faith in what you're doing.