问题描述:

自己写了一篇自动分割并保存指定数量的tomcat分割日志脚本,发现手动可以执行,但是添加到crontab中就无法执行的问题。


分析过程:

  1. 首先需要查看cron执行的日志:
[root@localhost cron.d]# tail -f /var/log/cron
[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. 查看自动运行脚本抛出的异常
[admi@localhost ~]$ crontab -e

把脚本运行结果定向到一个日志文件,然后保存

0 3 * * * /home/program/house/apache-tomcat-8.5.28/logs/deal_log.sh> /home/admi/111.txt

这样就可以看到脚本的运行错误了!
最后的结果是脚本中有这样一句代码

LOG_PATH=`pwd`

然后发现LOG_PATH变量的路径与要分析的路径不一致!

然后我就懵逼了。。。。
明明定义的脚本的目录是在需要分析的路径中啊,为什么自动执行的时候路径会不对呢?
度娘了一通,度娘说定时任务的脚本要写绝对路径!
我不死心。。。


验证过程:


  1. 手写测试脚本
#!/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. 添加到crontab中
*/1 * * * * /home/programs/house/apache-tomcat-8.5.28/test.sh > /home/admin/111.log

然后查看111.log文件内容,发现打印的是:/home/admi

注意:我的脚本是root用户添加的cron

  1. 继续度娘
    有的说是修改cron的配置文件(/etc/crontab)在该文件中添加
    HOME=自己定义的目录,这样cron的脚本就会在自定义的目录中执行了。
  2. 继续验证
    但是经过验证后发现无效!!

ps:可能我还是配置的不对,如果有成功的大神,希望不吝赐教,先叩首了。。。


最后:

目前我验证到的结论是:
cron自动执行的脚本的执行目录是用户的主目录(普通用户:~;root用户:/),所以书写cron脚本时脚本使用路径时一定要写绝对路径,以免发生错误!
在这次排错过程中还收获了:

  1. cron执行的环境和用户的环境也不一样;所以在排查问题是也要注意脚本执行失败是不是环境的问题(cron环境请执行 cat /etc/crontab查看)
  2. crontab的默认执行路径为:当前用户的主目录。
  3. 在/etc/cron.deny中可以定义不可使用cron的用户(如果不能执行cron看是否被限制)
    满足以上的条件,脚本基本上可以正常执行了。