只在工作日執行的指令碼

張京發表於2022-06-21

有時候我們會需要定時執行一個指令碼,那麼可以用cronjob來完成,比如這樣:

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

有時候,只希望這個指令碼在工作日執行,比如這樣:

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

但是工作日有時候又不是簡單的週一到週五,比如趕上個小長假什麼的,有時候週六要上班,有時候週一又不上班,這時候這樣的設定就容易亂,那我們怎麼設定這個cronjob才能讓他預知我們的放假排班計劃,並做到絲毫不亂呢?

只用cron是不行的,我們需要在指令碼里調取一個開放介面獲知放假安排,然後就可以按計劃執行了。

這個開放介面在這裡: https://github.com/NateScarle...

我們簡單寫一個指令碼:

#!/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

就可以每個工作日執行了。

相關文章