iis服务器助手广告广告
返回顶部
首页 > 资讯 > 操作系统 >Linux系统crontab定时运行shell脚本失败的问题及解决
  • 205
分享到

Linux系统crontab定时运行shell脚本失败的问题及解决

Linuxcrontabcrontab定时运行shellcrontab运行shell脚本失败 2023-04-07 15:04:45 205人浏览 泡泡鱼
摘要

目录1.最近开始学习linux系统使用2.脚本倒是很简单第一种第二种最后我找到两解决办法 总结1.最近开始学习Linux系统使用 经过一段时间学习终于学到了shell脚本,因为学的东西比较零散,突发奇想我学过了

目录
  • 1.最近开始学习linux系统使用
  • 2.脚本倒是很简单
    • 第一种
    • 第二种
    • 最后我找到两解决办法 
  • 总结

    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

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

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

    总结

    以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

    --结束END--

    本文标题: Linux系统crontab定时运行shell脚本失败的问题及解决

    本文链接: https://www.lsjlt.com/news/201335.html(转载时请注明来源链接)

    有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

    本篇文章演示代码以及资料文档资料下载

    下载Word文档到电脑,方便收藏和打印~

    下载Word文档
    猜你喜欢
    软考高级职称资格查询
    编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
    • 官方手机版

    • 微信公众号

    • 商务合作