Crontab向Syslog添加自定义消息异常:日志显示完整命令而非指定标识
解决Crontab任务日志显示完整命令而非自定义标识的问题
我来帮你搞定这个Crontab日志的问题!你遇到的情况其实涉及两个核心点:Cron本身的默认日志行为,以及你的命令可能没被正确解析。
问题根源
- Cron自带的日志记录:Cron本身就会把每个执行的任务命令行写到syslog里,这是它的默认操作——哪怕你不加
logger,这条CRON CMD日志也会出现,和你加的管道命令没关系。 - 管道符没被正确识别:从你给出的日志示例
Jan 30 09:42:01 raspberrypi CRON[3709]: (root) CMD (sudo ifconfig wlan0 up 2>&1 logger WiFi_UP)能看出来,命令里的管道符|不见了!这说明Cron调用的shell没正确解析管道,把logger当成了ifconfig的参数,而不是独立命令执行,自然也出不来你想要的自定义标识日志。
具体解决方案
1. 先让自定义标识日志正常生成
Cron默认用/bin/sh执行命令,有时候管道符会被异常处理,你可以用两种方式解决:
# 方式一:显式用bash执行完整命令,确保管道被解析 15 23 * * * /bin/bash -c 'sudo ifconfig wlan0 down 2>&1 | logger -t WiFi_Down' 15 9 * * * /bin/bash -c 'sudo ifconfig wlan0 up 2>&1 | logger -t WiFi_UP' # 方式二:拆分命令执行,避免管道解析问题,同时丢弃无用输出 15 23 * * * sudo ifconfig wlan0 down >/dev/null 2>&1 && logger -t WiFi_Down 15 9 * * * sudo ifconfig wlan0 up >/dev/null 2>&1 && logger -t WiFi_UP
方式二更贴合你“仅显示标识”的需求,>/dev/null 2>&1会把ifconfig的输出全部扔掉,只让logger生成带自定义标识的日志。
2. 去掉烦人的CRON CMD日志
如果想彻底删掉syslog里的完整命令记录,有两个选择:
- 单个任务处理:在命令末尾加
>/dev/null 2>&1(注意如果用了管道要调整位置),但这个只能屏蔽任务的输出,Cron本身的CMD日志还是会存在。 - 全局过滤(谨慎使用):修改rsyslog的配置文件(比如
/etc/rsyslog.d/50-default.conf),添加一条过滤规则,让syslog不记录Cron的CMD行:
:msg, contains, "CRON[*]: (root) CMD (" ~
添加后重启rsyslog服务:sudo systemctl restart rsyslog。不过这个方法会影响所有Cron任务的CMD日志,要是你还需要看其他任务的执行记录,就别用这个。
最终推荐配置
如果你只想在syslog里看到清晰的自定义标识,推荐用这个配置,还能加个简单的描述让日志更易懂:
15 23 * * * sudo ifconfig wlan0 down >/dev/null 2>&1 && logger -t WiFi_Down "WiFi已关闭" 15 9 * * * sudo ifconfig wlan0 up >/dev/null 2>&1 && logger -t WiFi_UP "WiFi已开启"
内容的提问来源于stack exchange,提问作者Tutek




