本文已参与「新人创作礼」活动,一起开启掘金创作之路。
问题描述: 自己写了一篇自动分割并保存指定数量的tomcat分割日志脚本,发现手动可以执行,但是添加到crontab中就无法执行的问题。
分析过程: 首先需要查看cron执行的日志: [root@localhost cron.d]# tail -f /var/log/cron 1 [root@localhost cron.d]# tail -f /var/log/cron Jan 18 20:01:01 localhost run-parts(/etc/cron.hourly)[27129]: starting 0anacron Jan 18 20:01:01 localhost run-parts(/etc/cron.hourly)[27141]: finished 0anacron Jan 18 20:02:01 localhost CROND[27175]: (admin) CMD (/home/web_programs/house_keeper/apache-tomcat-8.5.28/test.sh) 1 2 3 4 发现日志已经执行了自己写的脚本,但是脚本运行后的结果和手动执行后的结果不同,也就是说脚本执行错误。那么哪儿错误了呢?
查看自动运行脚本抛出的异常 [admi@localhost ~]$ crontab -e 1 把脚本运行结果定向到一个日志文件,然后保存
0 3 * * * /home/program/house/apache-tomcat-8.5.28/logs/deal_log.sh> /home/admi/111.txt 1 这样就可以看到脚本的运行错误了! 最后的结果是脚本中有这样一句代码
LOG_PATH=pwd
1
然后发现LOG_PATH变量的路径与要分析的路径不一致!
然后我就懵逼了。。。。 明明定义的脚本的目录是在需要分析的路径中啊,为什么自动执行的时候路径会不对呢? 度娘了一通,度娘说定时任务的脚本要写绝对路径! 我不死心。。。
验证过程:
手写测试脚本 #!/bin/bash
Author:admi
Date:2021-01-18
Description:test cron jobs
set -x
test_path=pwd
echo ${test_path} > /home/admin/111.txt
1
2
3
4
5
6
7
8
9
添加到crontab中
*/1 * * * * /home/programs/house/apache-tomcat-8.5.28/test.sh > /home/admin/111.log
1
然后查看111.log文件内容,发现打印的是:/home/admi
注意:我的脚本不是root用户添加的cron
继续度娘 有的说是修改cron的配置文件(/etc/crontab)在该文件中添加 HOME=自己定义的目录,这样cron的脚本就会在自定义的目录中执行了。
继续验证 但是经过验证后发现无效!!
ps:可能我还是配置的不对,如果有成功的大神,希望不吝赐教,先叩首了。。。
最后: 目前我验证到的结论是: cron自动执行的脚本的执行目录是用户的主目录(普通用户:~;root用户:/),所以书写cron脚本时脚本使用路径时一定要写绝对路径,以免发生错误! 在这次排错过程中还收获了:
cron执行的环境和用户的环境也不一样;所以在排查问题是也要注意脚本执行失败是不是环境的问题(cron环境请执行 cat /etc/crontab查看) crontab的默认执行路径为:当前用户的主目录。 在/etc/cron.deny中可以定义不可使用cron的用户(如果不能执行cron看是否被限制) 满足以上的条件,脚本基本上可以正常执行了。