CRON作业在每月的最后一天运行

如何解决CRON作业在每月的最后一天运行

| 我需要创建一个CRON作业,该作业将在每个月的最后一天运行。 我将使用cPanel创建它。 任何帮助表示赞赏。 谢谢     

解决方法

可能最简单的方法是简单地做三个单独的工作:
55 23 30 4,6,9,11        * myjob.sh
55 23 31 1,3,5,7,8,10,12 * myjob.sh
55 23 28 2               * myjob.sh
但这将在2月28日进行,即使在leap年也是如此,如果这是一个问题,您将需要寻找另一种方法。 但是,通常在每个月的第一天尽快完成这项工作既容易又正确,这基本上是这样的:
0 0 1 * * myjob.sh
并修改脚本以处理上个月的数据。 这可以消除您在确定哪一天是月份的最后一天时可能会遇到的麻烦,并且可以确保假设您正在处理数据,该月的所有数据都可用。在当月最后一天的午夜五点钟运行,可能会发现您错过了从那时到午夜之间发生的任何事情。 无论如何,对于大多数月底工作,这都是通常的方法。 如果您仍然真的想在一个月的最后一天运行它,一个选择是简单地检测明天是否是第一个(作为脚本的一部分,或者在crontab本身中)。 因此,类似:
55 23 28-31 * * [[ \"$(date --date=tomorrow +\\%d)\" == \"01\" ]] && myjob.sh
假设您有一个相对智能的
date
程序,应该是一个好的开始。 如果您的
date
程序不够先进,无法为您提供相对的日期,则可以将一个非常简单的程序组合在一起,即可为您提供明天的月份(您不需要
date
的全部功能) , 如:
#include <stdio.h>
#include <time.h>

int main (void) {
    // Get today,somewhere around midday (no DST issues).

    time_t noonish = time (0);
    struct tm *localtm = localtime (&noonish);
    localtm->tm_hour = 12;

    // Add one day (86,400 seconds).

    noonish = mktime (localtm) + 86400;
    localtm = localtime (&noonish);

    // Output just day of month.

    printf (\"%d\\n\",localtm->tm_mday);

    return 0;
}
然后使用(假设您在“明天的月份”中将其命名为
tomdom
):
55 23 28-31 * * [[ \"$(tomdom)\" == \"1\" ]] && myjob.sh
尽管您可能要考虑添加错误检查,因为something9ѭ和
mktime()
都可能在出错时返回
-1
。为了简单起见,上面的代码没有考虑到这一点。     ,与上述方法之一类似,可以使用一种稍短的方法。那是:
[ $(date -d +1day +%d) -eq 1 ] && echo \"last day of month\"
另外,crontab条目可能会更新为仅在28号到31号进行检查,因为它在每月的其他几天都没有意义。这会给你:
0 23 28-31 * * [ $(date -d +1day +%d) -eq 1 ] && myscript.sh
    ,设置Cron作业以在每月的第一天运行。然后将系统时钟更改为提前一天。     ,那在维基百科之后呢?
55 23 L * * /full/path/to/command
    ,根据paxdiablo的解决方案,我于2月28日至29日跑步。来自29号的数据将覆盖28号。
# min  hr  date     month          dow
  55   23  31     1,12   * /path/monthly_copy_data.sh
  55   23  30     4,11          * /path/monthly_copy_data.sh
  55   23  28,29  2                 * /path/monthly_copy_data.sh
    ,您可以设置一个cron作业在每月的每一天运行,并使其运行如下所示的shell脚本。该脚本可以计算出明天的天数是否小于今天的天数(即,如果明天是一个新月),然后执行您想要的任何事情。
TODAY=`date +%d`
TOMORROW=`date +%d -d \"1 day\"`

# See if tomorrow\'s day is less than today\'s
if [ $TOMORROW -lt $TODAY ]; then
echo \"This is the last day of the month\"
# Do stuff...
fi
    ,为了在基于@Indie解决方案的crontab中使用更安全的方法(使用
date
+
$()
的绝对路径不适用于所有crontab系统):
0 23 28-31 * * [ `/bin/date -d +1day +\\%d` -eq 1 ] && myscript.sh
    ,某些cron实现支持\“ L \”标志表示月份的最后一天。 如果您很幸运地使用了其中一种实现,则非常简单:
0 55 23 L * ?
该活动将在每月的最后一天晚上11:55进行。 http://www.quartz-scheduler.org/documentation/quartz-1.x/tutorials/crontrigger     ,
#########################################################
# Memory Aid 
# environment    HOME=$HOME SHELL=$SHELL LOGNAME=$LOGNAME PATH=$PATH
#########################################################
#
# string         meaning
# ------         -------
# @reboot        Run once,at startup.
# @yearly        Run once a year,\"0 0 1 1 *\".
# @annually      (same as @yearly)
# @monthly       Run once a month,\"0 0 1 * *\".
# @weekly        Run once a week,\"0 0 * * 0\".
# @daily         Run once a day,\"0 0 * * *\".
# @midnight      (same as @daily)
# @hourly        Run once an hour,\"0 * * * *\".
#mm     hh      Mday    Mon     Dow     CMD # minute,hour,month-day month DayofW CMD
#........................................Minute of the hour
#|      .................................Hour in the day (0..23)
#|      |       .........................Day of month,1..31 (mon,tue,wed)
#|      |       |       .................Month (1.12) Jan,Feb.. Dec
#|      |       |       |        ........day of the week 0-6  7==0
#|      |       |       |        |      |command to be executed
#V      V       V       V        V      V
*       *       28-31   *       *       [ `date -d +\'1 day\' +\\%d` -eq 1 ] && echo \"Tomorrow is the first today now is  `date`\" >> ~/message
1       0       1       *       *       rm -f ~/message
*       *       28-31   *       *       [ `date -d +\'1 day\' +\\%d` -eq 1 ] && echo \"HOME=$HOME LOGNAME=$LOGNAME SHELL = $SHELL PATH=$PATH\" 
    ,
00 23 * * * [[ $(date +\'%d\') -eq $(cal | awk \'!/^$/{ print $NF }\' | tail -1) ]] && job
在unix.com论坛上查看相关问题。     ,对于AWS Cloudwatch cron实施(计划Lambda等),此方法有效:
55 23 L * ? *
每个月的最后一天晚上11:55运行。     ,您只需将所有答案连接在一个cron行中,即可仅使用
date
命令。 只需检查一下今天和明天之间的月份之间的差额即可:
0 23 * * * root [ $(expr $(date +\\%d -d \'1 days\') - $(date +\\%d)  ) -le 0 ]  && echo true
如果这些差异小于0,则表示我们更改了月份,并且该月份的最后一天。     ,
55 23 28-31 * * echo \"[ $(date -d +1day +%d) -eq 1 ] && my.sh\" | /bin/bash 
    ,那这个呢? 编辑用户的
.bashprofile
添加:
export LAST_DAY_OF_MONTH=$(cal | awk \'!/^$/{ print $NF }\' | tail -1)
然后将此条目添加到crontab中:
mm hh * * 1-7 [[ $(date +\'%d\') -eq $LAST_DAY_OF_MONTH ]] && /absolutepath/myscript.sh
    

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-