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

 更新时间:2023年04月07日 14:42:43   作者:我叫瘦企鹅  
这篇文章主要介绍了Linux系统crontab定时运行shell脚本失败的问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教

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

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

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

总结

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

相关文章

  • VMware虚拟机安装Linux系统图文教程

    VMware虚拟机安装Linux系统图文教程

    这篇文章主要为大家详细介绍了VMware虚拟机安装Linux系统教程,文中安装步骤介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-10-10
  • Linux搭建Docker环境全过程

    Linux搭建Docker环境全过程

    这篇文章主要介绍了Linux搭建Docker环境全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Apache与Tomcat服务器整合的基本配置方法及概要说明

    Apache与Tomcat服务器整合的基本配置方法及概要说明

    网上的乱七八糟的资料太多了,很多都是自说自话,希望这篇文章能给大家带来一些清晰的思路。
    2010-12-12
  • Ubuntu 16.04与Apache虚拟主机配置的步骤详解

    Ubuntu 16.04与Apache虚拟主机配置的步骤详解

    这篇文章主要给大家介绍了关于Ubuntu 16.04与Apache虚拟主机配置的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用ubuntu16.04系统具有一定的参考学习价值,需要的朋友们来一起看看吧。
    2018-04-04
  • Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程)

    Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程)

    这篇文章主要介绍了Ubuntu 20.04 CUDA&cuDNN安装方法(图文教程),文中通过图文代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-07-07
  • linux特殊字符及其作用大全

    linux特殊字符及其作用大全

    这篇文章主要介绍了linux特殊字符及其作用,文中给大家补充介绍了linux特殊字符用法,需要的朋友可以参考下
    2018-04-04
  • CentOS 7.x安装部署Memcached服务器的详细方法

    CentOS 7.x安装部署Memcached服务器的详细方法

    这篇文章主要介绍了CentOS 7.x安装部署Memcached服务器的详细步骤,需要的朋友可以参考下
    2018-01-01
  • apache虚拟主机配置的三种方式(小结)

    apache虚拟主机配置的三种方式(小结)

    本文主要介绍了apache虚拟主机配置的三种方式,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • 搭建linux服务器详细教程

    搭建linux服务器详细教程

    这篇文章主要介绍了搭建linux服务器详细教程,主要包括linux服务器的部署、配置和搭建步骤,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-09-09
  • Linux内核如何输出中文字符的方法示例

    Linux内核如何输出中文字符的方法示例

    这篇文章主要介绍了Linux内核如何输出中文字符的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2019-09-09

最新评论