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
再次观察,脚本也成功执行了。
当然,我还查到了其他很多方法,时间有限,没有一一测试,大家有兴趣的话可以多试试其他方法。
总结
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。