迷之 crontab 异常:不运行、不报错、无日志?原来是这些原因
toqiye 2024-10-01 22:55 1 浏览 0 评论
1、背景
前几天新同学入职,一不小心将跳板机上的 crontab 清空了,导致凌晨一大批任务异常,同事问了运维同学也没有备份,这一百多个任务要是恢复起来可不是件容易的事儿。还好我去年某天开始做了定时备份,每分钟一次 backup 到本地磁盘,最后很容易的将 crontab 给恢复了。
这件事情过后我也在想,一台跳板机整个部门都共用一个账号, Linux 水平和安全意识又参差不齐,其实很难避免以后还会误操作,比如一下子将 home 目录全干掉。所以我想 backup 最好不要保存在本地,于是想一条命令将其备份到 hadoop 集群上去。
2、问题
当时觉得这个问题很简单,于是随手写了一条类似这样的命令:
*/1 * * * * /bin/cat <(seq 10) >> /root/a.log 2>&1
本地测试了没问题,但是 crontab 怎么都不成功,也看不到错误日志,a.log 一直是空的。
这个我就比较好奇了,按理说 a.log 应该是能拿到所有的标准输出和标准错误的,究竟什么原因导致 crontab 既不执行又不报错呢?
3、分析
debug 终极大法还是得看日志,本 case 最让人疑惑的在于没有日志,如果能找到日志所有的迷雾应该都能烟消云散。
于是,我尝试看看 /var/log 下有没有 crontab 的执行日志,看了下服务器居然没开启 cron.log,由于非管理员没权限修改任何配置或设置,于是我在本地 WSL 里用 Ubuntu 把问题复现了下。
3.1 开启 cron.log
sudo vim /etc/rsyslog.d/50-default.conf
cron.* /var/log/cron.log #将cron前面的注释符去掉
#重启rsyslog
#sudo /etc/init.d/rsyslog restart
sudo service rsyslog restart
sudo service cron restart
虽然能看到 crontab 执行日志了,但全都是一些没意义的日志或 info 提示:
Mar 31 20:58:20 Surface-Pro5 crontab[223]: (root) BEGIN EDIT (root)
Mar 31 20:58:53 Surface-Pro5 crontab[223]: (root) REPLACE (root)
Mar 31 20:58:53 Surface-Pro5 crontab[223]: (root) END EDIT (root)
...
Mar 31 21:13:01 Surface-Pro5 CRON[451]: (CRON) info (No MTA installed, discarding output)
Mar 31 21:14:01 Surface-Pro5 CRON[471]: (CRON) info (No MTA installed, discarding output)
...
仔细观察日志发现貌似在提示我们 MTA 没装,crontab 输出被丢弃了。同时查看 sudo tail -f /var/mail/<user> 发现爆出大量 warning: unable to look up public/pickup: No such file or directory! 的警告。
3.2 安装 postfix
由于 crontab 通知机制是将错误会以邮件形式发给所属登录账号或者系统管理员,如果没有安装邮件管理服务,那么这部分信息会被系统丢弃。那咱们安装 postfix 即可:
sudo apt-get install postfix
sudo service postfix start
再次查看日志发现了报错日志:
1 From root@Surface-Pro5.localdomain Sat Mar 31 21:33:38 2018
2 Return-Path: <root@Surface-Pro5.localdomain>
3 X-Original-To: root
4 Delivered-To: root@Surface-Pro5.localdomain
5 Received: by Surface-Pro5.localdomain (Postfix, from userid 0)
6 id CCE42300000000E229; Sat, 31 Mar 2018 21:25:02 +0800 (DST)
7 From: root@Surface-Pro5.localdomain (Cron Daemon)
8 To: root@Surface-Pro5.localdomain
9 Subject: Cron <root@Surface-Pro5> /bin/ls <(seq 10) >> /root/a.log 2>&1
10 MIME-Version: 1.0
11 Content-Type: text/plain; charset=UTF-8
12 Content-Transfer-Encoding: 8bit
13 X-Cron-Env: <SHELL=/bin/sh>
14 X-Cron-Env: <HOME=/root>
15 X-Cron-Env: <PATH=/usr/bin:/bin>
16 X-Cron-Env: <LOGNAME=root>
17 Message-Id: <20180331133337.CCE42300000000E229@Surface-Pro5.localdomain>
18 Date: Sat, 31 Mar 2018 21:25:02 +0800 (DST)
19
20 /bin/sh: 1: Syntax error: "(" unexpected
3.3 如何修复
看到邮件里的错误提示咱们立马就能明白 crontab 之所以无法执行,是因为 crontab 环境变量默认加载的是 sh,而非 bash,不支持进程代换这种语法,咱们有两种办法避免:
3.3.1 crontab 开头指定 shell 类型
完整的 crontab 格式如下:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * command to be executed
也就是说,咱们可以在 crontab 文件的开头指定 shell 类型这样就不会有问题了。
3.3.2 封装成脚本
其实不建议在 crontab 里执行复杂逻辑,最好封装成脚本,这样好控制,比如:
*/1 * * * * bash a.sh >> /root/a.log 2>&1
3.4 重定向无法获取错误的原因
虽然咱们根据错误日志知道怎样修改让命令正常执行,但是我们并未回答文章开头的疑问:究竟为何 2>&1 无法重定向拿到所有的标准输出和标准错误?有点违反常理了。这个还和 shell 解释器类型无关,比如下面这条命令,在 bash 下也是只能拿到标准输出,无法拿到标准错误:
ls <(ooxx) > debuglog/a.log 2>&1
这个问题的深层次原因得追溯到 shell 的一个概念:子进程
其实上图中的命令这样改也行:
ls <(ooxx >> debuglog/b.log 2>&1) >> debuglog/a.log 2>&1
因为 <() 是在子进程进行的,> debuglog/a.log 2>&1 只能拿到当前进程的标准输出与标准错误。
另外需要注意的是通过()或管道fork出来的子进程,继承了父进程的所有环境变量,和平时bash xxx.sh或者./xxx.sh起的不同的, 而$是一起继承的,但$BASHPID继承后重新赋值了,这和新开个bash的方式是不同的。
除了上面的写法,如果要深究茴字还有几种写法,那么还有如下两种写法:
bash a.sh > debuglog/a.log 2>&1
bash -c "ls <(ooxx)" > debuglog/a.log 2>&1
至此,从文章开头的问题,咱们从如何让日志输出以及代码如何改写,到最后的 root cause 都分析了一遍,希望能对大家有所启发和参考。
结尾:
小编近几年在学习Python!对于想学习Python的朋友们,我想说:很多人学了一个星期就放弃了,为什么呢?其实没有好的学习资料给你去学习,你们是很难坚持的,这是小编收集的Python入门学习资料。关注,转发,后台(我主页上方)如下图操作,即可免费灵取!希望对你们有帮助!
相关推荐
- 完美解决MAC电脑空间不足问题(完美解决mac电脑空间不足问题的办法)
-
很多用MAC(苹果笔记本)电脑的人,特别是做iOS开发的,都会遇到一个头疼的问题,那就是电脑磁盘空间不足的问题。这个问题也困扰了我好久,我的开发机是256G的SSD(固态硬盘),但是用着用着就会空间不...
- 系统清理软件Omni Remover for Mac版
-
内容介绍你是否需要一款可以帮你清理Mac系统顽固垃圾的工具呢?试试OmniRemoverforMac吧!OmniRemoverMac版是一款运行在Mac平台上的系统清理软件。OmniRem...
- mac上一款好用的多功能系统清理软件Omni Remover for Mac
-
mac上一款好用的多功能系统清理软件——OmniRemoverforMac。OmniRemovermac破解版是Mac平台上的一款软件清理工具。OmniRemoverMac版专为优化内存...
- 清理重建mac OS图标缓存(mac系统清空)
-
关于macos缓存问题你了解多少?今天macdown小编带大家了解下有关Mac清除图标缓存的相关知识!你知道吗?为了提升图形界面加载速度,默认情况下macOS针对Finder和Dock中的...
- iOS 9 人机界面指南(五):图标与图形设计
-
来人人都是产品经理【起点学院】,BAT实战派产品总监手把手系统带你学产品、学运营。文章索引5.1图标与图像尺寸(IconandImageSizes)5.2应用图标(AppIcon)5.2....
- 你中招了吗?盘古团队发布XcodeGhost病毒检测应用
-
最近大批知名iOS应用被感染XcodeGhost病毒事件闹得沸沸扬扬,虽然该病毒作者发表声明称,XcodeGhost源于自己的实验,没有任何威胁性行为,同时公开了源代码。但依然无法消除众多用户的担忧,...
- iOS应用感染Xcode真是无恶意实验?感染APP最新名单及版本号
-
前瞻科技快讯9月19日消息,一向号称是最安全的iOS真的不安全了?对于这两天闹得沸沸扬扬的多款iOS应用感染XcodeGhost病毒事件,今日凌晨4点左右,网友@XcodeGhost-Author在微...
- 苹果应用签名失败怎么处理(ios应用签名什么意思)
-
在移动应用开发过程中,苹果应用签名失败是一种常见的问题,它可能由多种原因引起。本文将介绍一些处理苹果应用签名失败的方法,帮助开发者解决这个问题。检查证书和描述文件:首先,开发者应该检查使用的证书和描述...
- 好用的系统扫描和清理工具推荐:OS Cleaner Pro for Mac
-
为大家推荐一款全面的系统扫描和清理工具,OSCleanerProforMac...
- 系统清理软件 Omni Remover for Mac
-
你是否需要一款可以帮你清理Mac系统顽固垃圾的工具呢?试试OmniRemoverforMac吧!OmniRemoverMac版是一款运行在Mac平台上的系统清理软件。OmniRemover...
- 优秀的Mac系统清理软件(mac清理系统占用空间)
-
OmniRemoverforMac是一款优秀的系统清理软件,功能有清洁卸载膨胀且顽固的应用程序,在macOSCatalina上清除32位不兼容的应用程序,iTunes,Xcode和Sketc...
- 苹果app安卓apk应用内用微信登录游戏时会显示登录失败怎么解决?
-
解决苹果iOS应用和安卓APK应用在使用微信授权登录时出现“登录失败,签名不一致”的问题,可以按照以下步骤进行排查和解决:1.核实AppID和AppSecret:确保iOS和安卓项目中使用的微信开放...
- Cleaner for Xcode(遗留废弃文件清理工具)
-
Mac上的Xcode总是占用很大空间,并且用的时间越久越大!可通过删除不需要的和不建议使用的文件来帮助您加快Xcode的运行速度,你可以每月或者每周运行一次进行清理。有需要的朋友,赶快来下载吧~Cle...
- Cleaner for Xcode mac(xcode清理工具)
-
Xcode文件太多,如何检测清理?试试CleanerforⅩcode吧!CleanerforXcodeforMac可以检测您的Xcode占用磁盘的情况,统计各个部件所占用的空间。并帮助您...
- 柠檬清理一款Mac设备必备的实用工具
-
简介柠檬清理是针对macOS系统专属制定的清理工具。主要功能包括重复文件和相似照片的识别、软件的定制化垃圾扫描、可视化的全盘空间分析、内存释放、浏览器隐私清理以及设备实时状态的监控等。重点聚焦清理功能...
你 发表评论:
欢迎- 一周热门
- 最近发表
-
- 完美解决MAC电脑空间不足问题(完美解决mac电脑空间不足问题的办法)
- 系统清理软件Omni Remover for Mac版
- mac上一款好用的多功能系统清理软件Omni Remover for Mac
- 清理重建mac OS图标缓存(mac系统清空)
- iOS 9 人机界面指南(五):图标与图形设计
- 你中招了吗?盘古团队发布XcodeGhost病毒检测应用
- iOS应用感染Xcode真是无恶意实验?感染APP最新名单及版本号
- 苹果应用签名失败怎么处理(ios应用签名什么意思)
- 好用的系统扫描和清理工具推荐:OS Cleaner Pro for Mac
- 系统清理软件 Omni Remover for Mac
- 标签列表
-
- systemproperties (65)
- show-overflow-tooltip (53)
- canvas图片 (57)
- npm版本管理 (61)
- localhost:15672 (59)
- materialtheme (86)
- node-ssh (68)
- 全局路由守卫 (57)
- springbootcachemanager (57)
- 图床搭建 (62)
- vue3addeventlistener (60)
- mybatisselectone (78)
- css圆形进度条 (69)
- androidble蓝牙开发 (62)
- vue-router的实现原理 (53)
- usememo (53)
- log4j.xml (54)
- maven跳过测试打包 (57)
- npmjsencrypt (55)
- android-gif-drawable (60)
- appender-ref (64)
- springbootmockito (68)
- css边框渐变色和圆角 (58)
- gsonfastjson (59)
- 依赖注入的方式 (62)