Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/unix/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linux 用于自动处理的Cronjob_Linux_Bash_Shell_Unix_Cron - Fatal编程技术网

Linux 用于自动处理的Cronjob

Linux 用于自动处理的Cronjob,linux,bash,shell,unix,cron,Linux,Bash,Shell,Unix,Cron,我需要为每个月设置一个cronjob,因为我不熟悉脚本,所以对脚本感到困惑 例如,我需要将cronjob设置为每个月末的-5和+2个工作日 2014年11月11日、24日、25日、26日、27日、28日至2014年12月11日,共2天 如何为此编写cronjob脚本。无需编写脚本,只需在“crontab”中设置即可 “crontab”可以处理范围和逗号分隔的列表。请参阅“man 5 crontab”或这本相当不错的指南: 根据您所在的位置,工作日可能会有所不同。此处假设西方工作周,即“1-5”

我需要为每个月设置一个cronjob,因为我不熟悉脚本,所以对脚本感到困惑

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

2014年11月11日、24日、25日、26日、27日、28日至2014年12月11日,共2天


如何为此编写cronjob脚本。

无需编写脚本,只需在“crontab”中设置即可

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

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

请核对一下。第二天。day涵盖周末在不同地点的情况。 我也建议跑步

export EDITOR=nano

在启动“crontab-e”之前,除非您熟悉“vim”编辑器。

以下脚本将测试今天是一个月的最后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
工作原理:
do_run
如果今天是(1)个工作日,并且(2)是当月前两个工作日之一,或者(3)是当月最后五个工作日之一,则返回true。一次只取一块:

  • do\u run()

    这将启动名为
    do\u run
    的shell函数的定义

  • dom=$(日期'+%\u d')

    这将shell变量
    dom
    设置为月份的第几天。这将是一个从1到31的数字

  • dow=$(日期'+%u')

    这将shell变量
    dow
    设置为一周中的某一天,其中1=周一,7=周日

  • currentm=$(日期'+%\m')

    这将shell变量
    currentm
    设置为1=一月,12=十二月的月份数

  • nextm=$(日期-d'+7天+%\m')

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

  • limit=(0442)

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

  • [“$dow”-le 5]

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

  • [“$dom”-le“${limit[$dow]}”]

    如果一个月的某一天小于或等于一周中该天的限制,则返回true

    作为一个例子,考虑一个月份,其中第四是星期一。对于这种情况,

    dom=4
    dow=1
    。根据
    limit
    的定义,
    ${limit[$dow]}
    为4。因为4小于或等于4,所以该测试返回true,正确地指示本周一是一个月的前两个工作日之一

  • [“$currentm”-ne“$nextm”]

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

    如果今天是一个月的前2个或最后5个工作日之一,则上述三个测试与
    &&
    |
    逻辑结合,返回true

  • do_运行&&/path/command

    如果
    do\u run
    返回true,则将执行
    /path/command
    。否则,它将不会被执行


谢谢你的回答,但是每个月的工作日都会改变,我该怎么办@阿贾斯:你有几周从周一到周五都不工作吗?或者你的意思是什么?现在我的工作时间很短,但我以前在另一个国家工作过,先是在美国,后是在美国。周末在中东是不同的。阿贾斯克尔,这是一个很好的,聪明的月底解决方案。但是,在某些月份,将跳过该月前两个工作日中的一个或两个工作日。假设一个周一至周五的工作周,2014年3月就是一个例子,上面的crontab不会执行该月的前两个工作日。你能接受吗,@Sinsha?不,@John1024,你能帮我解决这个问题吗?如果我必须在一个月的第一个工作日设置cron作业,那么如何设置cron作业@John1024我对这个脚本有疑问,道琼斯指数=$(日期'+%u')。在这种情况下,sunday的值=0或7;我对此感到困惑?因为在crontab中,我们将定义0=sunday并继续。。。。。请澄清这一点@Joh1024@Shirchabayshan(A)最简单的方法是让
cron
每天运行此脚本。此脚本将仅在您想要的日期运行
/path/command
。(B)
date'+%u'
返回1到7,其中1=周一,7=周日。因此,
[“$dow”-le 5]
在工作日是正确的,并且仅在工作日是正确的。这记录在
人员日期
中。是的,crontab约定是不同的,但这与我们在哪里使用
date
test
[
)无关。
#!/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