只在工作日执行的脚本

业界 作者:SegmentFault 2022-06-28 13:46:47

作者:张京

来源:SegmentFault  思否社区 


有时候我们会需要定时执行一个脚本,那么可以用cronjob来完成,比如这样:


10 04 * * * /usr/local/bin/somework.sh


有时候,只希望这个脚本在工作日执行,比如这样:


10 04 * * 1-5 /usr/local/bin/somework.sh

但是工作日有时候又不是简单的周一到周五,比如赶上个小长假什么的,有时候周六要上班,有时候周一又不上班,这时候这样的设置就容易乱,那我们怎么设置这个cronjob才能让他预知我们的放假排班计划,并做到丝毫不乱呢?


只用cron是不行的,我们需要在脚本里调取一个开放接口获知放假安排,然后就可以按计划执行了。


这个开放接口在这里:

https://github.com/NateScarlet/holiday-cn


我们简单写一个脚本:


#!/usr/local/bin/python
"""每天定时执行脚本"""
import datetime
import requests


def will_work(date):
    """检查该天是否需要工作"""
    holiday_data = requests.get(
        url='https://natescarlet.coding.net/p/github/d/holiday-cn/git/raw/master/2022.json'
    ).json()
    # 放入公司规定的特殊考勤日
    holiday_data['days'].append({
        'date''2022-06-21',
        'isOffDay': False
    })
    # 检查该日期是否在列表中
    days_in_list = [day for day in holiday_data['days'if day['date']
                    == datetime.datetime.strftime(date, '%Y-%m-%d')]
    if days_in_list:
        # 是否在节假日倒休表里,如果在倒休表里,按倒休表作息
        return not (days_in_list[0]["isOffDay"])
    else:
        # 按照周一至周五作息
        return True if date.weekday() < 5 else False


def main():
    """主函数"""
    if will_work(datetime.datetime(2022, 6, 21, 0, 0, 0, 0)):
        print("今天要上班")
    else:
        print("今天不上班")


if __name__ == '__main__':
    main()


赋予它执行权限:


chmod +x somework.py


然后定一下cronjob:


10 04 * * * /usr/local/bin/somework.py


就可以每个工作日执行了。




点击左下角阅读原文,到 SegmentFault 思否社区 和文章作者展开更多互动和交流,扫描下方”二维码“或在“公众号后台回复“ 入群 ”即可加入我们的技术交流群,收获更多的技术文章~

- END -


关注公众号:拾黑(shiheibook)了解更多

赞助链接:

关注数据与安全,洞悉企业级服务市场:https://www.ijiandao.com/
四季很好,只要有你,文娱排行榜:https://www.yaopaiming.com/
让资讯触达的更精准有趣:https://www.0xu.cn/

公众号 关注网络尖刀微信公众号
随时掌握互联网精彩
赞助链接