linux crontab执行shell脚本中包含相对路径的问题

实例一 test.sh文件java

echo `date`>test.logshell

配置crontab框架

设置 */1 * * * * sh /data/test.shui


在/data/目录下,未找到test.log文件,重启了crontab服务,service cronb restart,发现仍是不行。spa


在网上找资料,怀疑是相对路径的问题,而后,在home目录下,cd ~,发现了test.log。调试


转摘资料:rest

crontab执行java程序的问题:

一 crontab使用注意:
crontab -l查看该用户的crontab配置,crontab -e编辑该用户的crontab配置配置通常在末尾加上 2>&1表示错误输出(2)和标准输出(1)同样输出到同一个由前面>>指定的地方
如 15 14 * * * /sys_back/monitor.sh >>/sys_back/log/monitor.log 2>&1
表示天天14:15执行monitor.sh脚本,错误和标准输出都写入monitor.log文件
涉及到文件名时最好写绝对路径!日志

二 问题及解决
shell脚本有echo语句,有java -jar执行java程序。直接执行脚本时,一切顺利,可是放到crontab中执行时,echo语句正常,java程序却没有执行。进程

1 网上查找,以为应该是环境变量的问题。说是要将java环境变量加入到shell脚本中,按照
这个方法作,发现问题依然存在。
百思不得其解。
2 经转换角度,看java程序是否有问题。在java语句中直接加入打印语句,发现其在crontab日志中
竟然能够显示。终于肯定是java程序的问题。java程序功能很简单,就是一个语句java -Dosgi.console -Dosgi.configuration.area=./configuration -jar equinox.jar -console用来启动osgi框架。
因而在shell脚本中不调用java程序,直接改成程序中的这一句,问题解决。
可是又引起新的问题:直接java -jar会源源不断的输出osgi>到日志文件,致使日志文件愈来愈大。
不可行。再想办法解决。
3 感受仍是相对路径的问题。尝试在crontab调用的脚本中用相对路径向一个文件输出一句话,发现失败。(单独执行脚本没问题)既然如此,是否是java程序中也不能用相对路径呢。遂将./configuration及equinox.jar都用绝对路径,再调试,终于成功,至此问题解决。但始终感受在程序中用绝对路径很不方便维护。crontab

三 附加问题及解决 此脚本的做用就是判断osgi程序是否在运行,若是不运行则启动。 实现思路是ps -elf获得进程id及状态,若是id不存在,则启动,若是id存在但状态不是运行中(solaris为O,AIX为A),则杀掉原进程从新启动。 发现程序在运行几天后会自动停掉,觉得是java程序有问题,然而却始终找不到问题在哪里。在解决上面问题时,却意外的发现可能不是java程序的问题。man ps时发现,solaris中,进程状态除了O,还有S(sleeping) R(Runnable) Z(Zombie僵尸进程)T(stopped),只有后两种状态下进程才是有问题的,因此极可能是crontab执行脚本时,程序状态非O就被杀掉,重启时却由于上面的问题没成功。因而修改脚本,状态是后两种时才重启。这个问题也解决了。

相关文章
相关标签/搜索