linux定时任务每天的0点执行一次,怎么写

老实说,要使用计划的 crontab 作业,您必须首先运行 cron 服务。
这就像一个未连接的设备,无法运行程序。

我们先来说说最重要的事情。
crontab是根据用户来划分的。
使用该帐户登录的任何人都可以编辑该人的待办事项列表。
在我们去年运行的项目中,一个新人更改了root crontab,导致整个系统定期重新启动。
说实话,当时非常尴尬。
还有一点,编辑时,使用-e参数将vi编辑器设置为默认。
如果不知道怎么用,可以安装nano或者修改crontab -e后面的参数,避免每次都崩溃。
还有另一个重要的细节。
星号代表整个范围,但要小心使用“/”和“-”。
例如“/5 ”表示每5 个单位,“/5 0 9 ”表示每天早上9 点执行。
很多人不注意这一点。

一开始我以为crontab语法很简单,后来发现是错误的。
输入“mon-wed 1 1 4 ”只会给出错误。
应为“0 1 1 星期一,星期三”。

温馨提示:使用“0 2 3 -7 /1 ”设置晚上1 1 点到早上7 点每小时执行一次,但不要写成“0 2 3 -7 /1 ”。
2 3 到7 点每小时运行一次,必须是“0 2 3 -7 /1 ”才正常。

如何在Linux中定时执行任务 Linux crontab定时配置详解

说实话,刚接触Linux的时候,使用crontab处理定时任务让我有一段时间很头疼。
尤其是那个时间的表达,乍一看还真有圣经的感觉。
比如我刚配置的时候,想每小时备份一次,所以直接写成0//path/to/script.sh,但是系统根本不识别。
后来我发现星号放错了位置,我不得不将其更改为0/path/to/script.sh。
你需要记住这个细节。
否则等待系统运行就白费力气了。

有趣的是,系统级和用户级任务的组织方式有很大不同。
我之前有一个项目使用 /etc/cron.d/ 来管理任务。
每个服务都有单独的文件,因此您可以在部署和更新代码时直接替换文件。
然而,也有一些陷阱需要警惕。
例如,某个脚本需要访问项目目录,但在cron执行环境中找不到该路径。
经过长时间调试,终于发现需要在脚本开头添加 cd /opt/myproject/ 。
否则运行文件时会报各种错误。

我也步入了权威的陷阱。
有一次我使用 root 帐户配置了一个 cron 作业,但该脚本需要将日志写入特定目录,因此当我运行该脚本时,我没有足够的权限。
后来我给该目录添加了写权限,问题就解决了。
说白了,你需要清楚地考虑哪个用户的cron正在运行。
如果是系统任务,则取决于配置文件中指定的用户。
如果这是一个用户任务,默认是当前用户,但要注意用户主目录的权限。

输出重定向也容易出现问题。
我曾经使用监控脚本而没有过多的重定向。
我每天早上都会收到大量电子邮件,我的老板认为我的服务器有问题。
后来将输出更改为日志文件解决了问题。
但是,如果脚本中存在错误,直接重定向到 /dev/null 将抑制错误消息。
这需要权衡。
我个人喜欢分别记录标准输出和标准错误,以方便故障排除。

对于先进技术,模块化可以提高效率。
我有一个习惯,只将顶层逻辑放在crontab中并调用特定的执行脚本。
示例:
/5 /opt/scripts/process_data.sh
process_data.sh 是:bash !/bin/bash CD /数据/项目 python3 parsing_data.py gzip 结果.json
这样,更新脚本只需要更改脚本本身,而不需要触摸 crontab。
另一个技巧是将其与 SystemdTimer 结合起来。
我们目前正在维护定期数据同步。
使用 SystemdTimer 比 crontab 好得多。
它支持失败时的重试和条件触发,并且可以直接在Journald中查看日志,这比创建单独的日志文件更方便。
配置也很简单。
您只需要创建 .service 和 .timer 文件。

但是最不方便的就是环境变量。
我有一个用 Go 编写的计划任务,需要加载特定的动态库。
我有,但是在cron环境下找不到。
最后我在脚本中编写了export LD_LIBRARY_PATH=/usr/local/lib。
这是可行的,但仍然感觉有点hacky。
对此,我建议尝试标准化您的部署环境以减少这些兼容性问题。

简单来说,crontab使用起来很方便,但是细节较多,需要耐心调试。
对于较新的系统,SystemdTimer 实际上更加标准化,有时会使用 at 命令。
关键是要看场景。