踩坑Linux系统crontab定时运行shell脚本失败的问题

本文记录了一位Linux初学者在使用crontab定时执行shell脚本时遇到的问题及解决过程。问题包括脚本执行权限、环境变量与PATH设置、crontab定时任务执行失败等。通过将脚本目录添加到PATH环境变量,或在crontab任务中指定脚本完整路径,解决了脚本无法被crontab找到的问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.最近开始学习Linux系统使用,经过一段时间学习终于学到了shell脚本,因为学的东西比较零散,突发奇想我学过了crontab定时任务,今天也学了shell脚本的编写,为何不组合一下,既能提升学习深度,又能锻炼自学能力,何乐而不为呢?但是没想到,我已步入了Linux的坑。

2.脚本倒是很简单,因为刚学习,写的命令都很简单,请各位大神不要笑我,我写这篇博客目的一是为了记录踩过的坑,加深映像,二是给和我一样的新手提个醒,避免长时间陷入到坑里。以下是我shell脚本的代码

#!/bin/bash
date >> /myshell/date.log

 这个脚本的作用是每次运行该脚本,将当前时间累加写入在/myshell/文件夹下的date.log文件中,首先我们要给这个脚本添加执行权限用添加权限的命令就行了

chmod 777 time.sh

目前我遇到的问题是要执行该脚本,目前只能在脚本所在目录用./time.sh执行。所以为了解决这个问题,我经过思考和某度,找到了两种方式让我们的脚本在其他目录直接使用time.sh命令都可以运行脚本。

第一种:我们使用$PATH查看系统现有的环境变量目录,也就是如果将我们的脚本放到这些任一个目录中,就可以在其他目录使用time.sh来运行我们的脚本。但是由于这些目录存放的文件都是比较重要的。或是系统文件,所以这种方式我觉得不太推荐,当然,高手的话随意就行,对于我这种初学者的话就尽量避开这种危险的东西。

第二种:我思考既然通过$PATH看到的这些目录,把脚本放进去就可以在其他地方运行,那我们应该也可以把我们写的脚本所在的目录添加到这个环境变量中,这样就可以达到我们的目的,于是根据这个思路,我又进行了某度,找到了解决方法。可以用

vim /etc/profile

打开这个文件,在文件中添加如下代码:

export PATH=/myshell:$PATH

添加后保存退出,这段代码的原理就是在系统调用这个文件的时候,将环境变量PATH和我们需要自定义的目录拼接起来重新生成的PATH环境变量替换以前的,达到我们需要设置自定义目录的目的,要让我们编辑的内容生效,相当于让系统重新加载我们修改过的这个文件,用如下命令就行:

source /etc/profile

这样,再用$PATH命令查看,就可以看到我们自定义的文件夹也到PATH这个环境变量的值中了。这时候执行一下命令time.sh发现/myshell目录下就多了一个date.log文件了。再其他目录执行time.sh命令,然后查看date.log命令,相应时间也在文件中累加了。原以为再用crontab把定时执行任务设置好就大功告成,可是更大的坑才刚刚开始。

添加定时执行任务

* 11 * * * time.sh

这个任务意思就是在十一点到十二点这个范围内,每隔一分钟执行一下time.sh这个脚本。具体的语法不知道的初学者可以某度一下,资料很多的。

重启一下crontab服务

service crond restart

然后使用命令实时查看date.log文件累加内容的情况

tail -f date.log

等了很长时间,内容都没变,是定时任务没执行成功?还是脚本出错了?然后赶紧疯狂某度一下crontab运行的日志记录文件存放位置,实时更新查看一下:tail -f /var/log/cron

等了几分钟,发现每隔一分钟定时任务有执行记录97215982583c4a7ea3d14d8499219f55.png

但是查看date.log文件,发现内容并没有累加。看来可能是crontab执行时候出错了。于是修改定时任务语句,将定时任务执行的错误信息也写入到date.log文件中,看看报错内容是什么。将定时任务修改为以下代码

* 11 * * * time.sh >> /myshel/date.log 2>&1

 等几分钟,查看date.log的内容,显示如下4946ade9cf7e43089c750335a620efe1.png

没有找到命令,可是我刚才不管是在文件目录还是其他目录都执行成功脚本了啊,为什么crontab执行还是报错找不到脚本呢?

会不会是环境变量的问题呢,带着猜想我再次进行某度,过程很艰辛,最后算是证实我的猜想是对的,就是系统环境变量和crontab使用的环境变量不一样导致的,其中过程由于篇幅有限,我就不细述了,直接说解决办法,最后我找到两解决办法 :

第一:定时任务语句中以root用户来执行,修改定时任务语句如下:

* 11 * * * su - root -c time.sh

而后发现脚本成功执行了。

第二:定时任务脚本前面加上脚本所在目录绝对路径,定时任务语句修改为:

* 11 * * * /myshell/time.sh

再次观察,脚本也成功执行了。

当然,我还查到了其他很多方法,时间有限,没有一一测试,大家有兴趣的话可以多试试其他方法。

初学者初到此地,有写的不准确或错误的地方希望大家多多包涵指正,我也会虚心接受修改。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值