Linux系统crontab定时运行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

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

但是查看date.log文件,发现内容并没有累加。

看来可能是crontab执行时候出错了。

于是修改定时任务语句,将定时任务执行的错误信息也写入到date.log文件中,看看报错内容是什么。

将定时任务修改为以下代码

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

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

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

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

最后我找到两解决办法

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

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

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

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

* 11 * * * /myshell/time.sh

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

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

总结

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

(0)

相关推荐

  • Linux crontab定时执行Shell脚本需要执行特定的命令时解决思路

    由于一些不可抗拒的原因,项目部署后需要定时检测项目是否正常运行,否则将执行重启命令. 在具体实施过程中发现,定时器执行无误,但是重启命令无法正常启动.多方查找发现Shell脚本中的Java命令需要引入环境变量方可正常执行.因此做了一下修改,脚本如下(仅供参考): 1.crontab执行配置 * * * * * cd /项目目录 && ./auto_start.sh >> /log/auto.out 2.Shell脚本 #!/bin/bash #导入环境变量 export LAN

  • linux注释crontab文件及crontab执行sh的坑记录

    目录 linux注释crontab文件及crontab执行sh的坑 遇坑1 坑2 crontab快速注释及撤销注释 批量快速注释及撤销注释 总结 linux注释crontab文件及crontab执行sh的坑 原来,在Linux下写了很多crontab,来定时执行某些任务, 现在有以下需求: 需求:是要注释某些crontab任务, 方法:只要在所要取消的crontab任务前,加'#'即可. e.g. 5 4 * * sun echo "run at 5 after 4 every sunday&q

  • 详解Linux定时任务Crontab的介绍与使用

    目录 一.cron介绍 二.crontab的使用 三.常见定时任务设置 四.实例操作 1.文件实时写入 2. 定期清理对应目录下的文件 五.常见错误 一.cron介绍 linux内置的cron进程能帮我们实现这些需求,cron搭配shell脚本,非常复杂的指令也没有问题. 1. var/spool/cron/ 目录下存放的是每个用户包括root的crontab任务,每个任务以创建者的名字命名 2. _/etc/crontab 这个文件负责调度各种管理和维护任务. 3. /etc/cron.d/

  • Linux Crontab Shell脚本实现秒级定时任务的方法

    一.编写Shell脚本crontab.sh #!/bin/bash step=1 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do $(php '/home/www/php/crontab/crontab.php') sleep $step done exit 0 二.crontab -e 输入以下语句,然后:wq 保存退出 # m h dom mon dow command * * * * * /home/www/php/crontab

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

    目录 1.最近开始学习Linux系统使用 2.脚本倒是很简单 第一种 第二种 最后我找到两解决办法 总结 1.最近开始学习Linux系统使用 经过一段时间学习终于学到了shell脚本,因为学的东西比较零散,突发奇想我学过了crontab定时任务,今天也学了shell脚本的编写,为何不组合一下,既能提升学习深度,又能锻炼自学能力,何乐而不为呢?但是没想到,我已步入了Linux的坑. 2.脚本倒是很简单 因为刚学习,写的命令都很简单,请各位大神不要笑我,我写这篇博客目的一是为了记录踩过的坑,加深映像

  • 一个Linux系统安全设置的Shell脚本的分享(适用CentOS)

    我们将常用的系统安全配置制作为一个shell脚本,只需要在服务器上运行这个shell脚本即可完成安全设置. linux的系统安全设 置Shell脚本是第二次更新,已经大量应用在某大型媒体网站体系中,加入了之前没有想到的一些安全设置.使用方法将其复制,保存为一个shell文件, 比如security.sh.将其上传到Linux服务器上,执行sh security.sh,就可以使用该脚本了! 复制代码 代码如下: #!/bin/sh# desc: setup linux system securit

  • linux系统下定时执行php脚本的方法

    前言 在windows服务端定时执行某个程序代码还是比较简单的,只要在系统中做定时任务就可以了,目前刚刚接触到linux下的定时任务,这在好多公司的面试中都会提到的,而对于linux小白的我来说,是个不小的挑战,听单位的同事说,linux定时执行PHP脚本也是很简单的,linux系统实现计划任务一般采用crontab工具,好了,目前分享一个可以执行成功的php脚本,供大家参考了. 1. 在需要定时执行的PHP文件的第一行加 view plain copy #! /bin/local/php -q

  • 如何使用Linux的Crontab定时执行PHP脚本的方法

    下面介绍Crontab的两种方法. 一.在Crontab中使用PHP执行脚本 就像在Crontab中调用普通的shell脚本一样(具体Crontab用法),使用PHP程序来调用PHP脚本. 每一小时执行myscript.php如下: 复制代码 代码如下: # crontab -e 00 * * * * /usr/local/bin/php /home/john/myscript.php /usr/local/bin/php为PHP程序的路径. 二.在Crontab中使用URL执行脚本 如果你的P

  • 阿里云云服务器Linux系统更新yum源Shell脚本

    所有执行的脚本都需要root身份来执行,执行方法:以root身份执行命令:bash xxx.sh 功能:自动检测系统并更新源 适用系统版本:兼容线上所有linux版本 执行方法:以root身份执行命令:bash update_source.sh 解决了什么问题:一键式检测系统并更新源 给客户带来了好处:用户只需执行该脚本一次即可自动检测系统并更新源. 备注:由于系统版本都有支持的周期所以部分源可能会出现不可用的情况,包括官方的源,这是正常情况 #!/bin/bash ##############

  • centOS6中使用crontab定时运行执行jar程序的脚本

    1.编写一个简单的java程序 public class testshell { public static void main(String[] args) { int count = 0; for (String arg : args) { System.out.println("第" + (++count) + "个参数:" + arg); } } } 将上述程序打包放到centOS6中 2.编写shell脚本 #!/bin/bash export JAVA_

  • Linux启动jar包的shell脚本

    背景: 项目设备端需要运行jar包程序与服务端进行socket连接并发送数据,每次启动进程时,都需要在Linux终端输入启动jar包的命令,比较繁琐,随之尝试将启动jar包的命令写入shell脚本文件中,实现操作shell脚本启动jar包程序的功能. 编写的socdev.sh脚本文件中命令如下: #启动命令所在目录 HOME='/home/pi/Desktop/java' #获取mac地址(唯一的) mac=`ifconfig | grep eth0 | awk '{print $5}'` st

  • Linux下使用Shell脚本获取终端宽度的解决方法

    获取终端大小时候的学习 在写shell脚本时想输出一行占满整个终端屏幕宽度的 横杠 发现for循环会导致执行缓慢 解决方法: 使用yes 命令 sed '50q' 显示50行 tr -d '\n' 删除 \n 多次重复输入相同字符可用yes yes "2" | sed '50q' | tr -d '\n' 想法来自:打印100个连续的符号,不用循环 ---------------------------------------------------------------------

  • IDEA中编写并运行shell脚本的实现

    IEDA中的bashsupport插件支持在IDEA中编写shell脚本文件,有友好的代码格式,支持自动补全,检查错误,并且配置完之后,还可以在IEDA中直接运行shell脚本.下面将一步一步演示插件的安装和配置. 打开IEDA,安装bashsupport插件  安装完之后,保持插件选中并切实enable的状态,如下图所示,然后重启IDEA. 安装git软件. https://www.git-scm.com/download/ 基本上直接安装全部默认就可以,不过要记住自己的安装目录. IDEA配

随机推荐