Cronjob用于自动过程

时间:2014-11-18 06:48:02

标签: linux bash shell unix cron

我需要为每个月设置一个cronjob,因为我是脚本新手,我对脚本感到困惑。

例如,我需要将cronjob设置为每个月结束的-5和+2个工作日。

2014年11月11/24日,25,26,27,28,截止到2014年12月11日,02天。

如何为此编写cronjob脚本。

2 个答案:

答案 0 :(得分:2)

无需编写脚本,只需将其设置在" crontab"

crontab -e


* * 24-31 * 1-5    /path/command
* * 1-2   * 1-5    /path/command

" crontab的"可以处理范围和逗号分隔的列表。请参阅" man 5 crontab"或者这个相当不错的指南:

https://help.ubuntu.com/community/CronHowto

根据您所处的位置,工作日可能会有所不同。西方工作周假设在这里,即" 1-5" =周一至周五。

请检查24.天--- 2.天涵盖周末在不同地方的情况。 我还建议你去运行

export EDITOR=nano

开始之前" crontab -e"除非你熟悉" vim"编辑器。

答案 1 :(得分:1)

以下脚本将测试今天是否是本月的最后5个工作日或前2个工作日之一。如果是这样,它将执行/path/command。对于此代码,假设工作日是星期一到星期五。该脚本应该每天运行一次:

#!/bin/bash
do_run() {
    dom=$(date '+%_d') # 1-31, day of month
    dow=$(date '+%u') # 1-7 with 1=Monday, day of week
    currentm=$(date '+%_m')
    nextm=$(date -d '+7 days' '+%_m')
    limit=(0 4 4 2 2 2)
    [ "$dow" -le 5 ] && {
        [ "$dom" -le "${limit[$dow]}" ] ||
        [ "$currentm" -ne "$nextm" ]
    }
}

do_run && /path/command

工作原理:

如果今天是(1)工作日,则

do_run返回true,或者(2)它是该月的前两个工作日之一,或者(3)是该月的最后五个工作日之一。一次拿一件:

  • do_run()

    这将开始定义名为do_run的shell函数。

  • dom=$(date '+%_d')

    这会将shell变量dom设置为该月的某一天。这将是1到31之间的数字。

  • dow=$(date '+%u')

    这将shell变量dow设置为星期几,1 =星期一,7 =星期日。

  • currentm=$(date '+%_m')

    这将shell变量currentm设置为月份数,1 = 1月,12 = 12月。

  • nextm=$(date -d '+7 days' '+%_m')

    这会将shell变量nextm设置为从现在起7天后的月份数。

  • limit=(0 4 4 2 2 2)

    这定义了shell数组limit。 (见下文。)

  • [ "$dow" -le 5 ]

    如果当天是工作日,则返回true

  • [ "$dom" -le "${limit[$dow]}" ]

    如果月中的日期小于或等于此周日的限制,则返回true。

    作为一个例子,考虑一个月,其中第四个星期一。在这种情况下,dom=4dow=1。根据{{​​1}}的定义,limit为4.由于4小于或等于4,此测试返回true,正确地指示此星期一是该月的前两个工作日之一。

  • ${limit[$dow]}

    如果我们在该月的最后一周内,则返回true。

    如果今天是本月的前2个或最后5个工作日之一,则上述三个测试与[ "$currentm" -ne "$nextm" ]&&逻辑组合以返回true。

  • ||

    如果do_run && /path/command返回true,则会执行do_run。否则,它将不会被执行。