2012-11-07 60 views
0

我一直在摸索着我的头脑。 我有一个由root cron作业运行的脚本。 该脚本执行,但脚本内有一个不会执行的脚本。 这里是我们称之为SCRIPTA在shell脚本中执行shellscript

#!/bin/bash 
lines=`wc -l < /var/www/log/addme`; 
DATE=`date +%Y-%m-%d` 

if [[ $lines > 4 ]]; 
then 
echo " " > /var/www/log/addme 
RESTART=/var/www/log/restart.sh 
$RESTART 
else 
echo "No new hosts added" | wall 
fi 

基本上什么restart.sh脚本做是为了重新启动服务。当我从终端运行它们 一切都运行得很好,但不能作为cron作业... 我也试图只是把

./restart.sh 
/var/www/log/restart.sh 

但随着相同的结果。 有什么想法?

+0

cron作业是以超级用户还是以其他用户身份运行?用户是否可以访问/ var/www/log?你有没有试过记录第一个脚本尝试调用第二个脚本时发生了什么(将'$ RESTART'更改为'$ RESTART> /var/tmp/foo.log 2>&1')? –

+0

'/ var/www/log/restart.sh'上有什么权限?它是可执行的吗?如果没有,你可以'chmod + x',或者在脚本A中用'bash $ RESTART'运行它。 – ghoti

+0

此外,设置了'MAILTO'可变你的crontab里面,这样就可以看到由工作产生什么错误。 – ghoti

回答

2

我怀疑你遇到了cron运行它的最小环境的问题。最重要的是PATH是非常小的,你的脚本可能使用了一些无法找到的命令。

如果出现这种问题,可以采取以下几种方法解决问题:最简单的方法是在运行脚本的条目之前,将适当的PATH定义添加到crontab文件中。类似这样的:

PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin 
0 * * * *  /var/www/log/scriptA 

第二个是在scriptA的开头添加一个类似的赋值。第三个选项是通过两个脚本,并使用所有命令的完整路径(例如/usr/bin/wc而不是wc)。

顺便说一句,还有一个测试[[ $lines > 4 ]]的问题 - [[ ]],>内部做一个字符串(字母)比较,而不是数字比较。这是一个问题,因为按字母顺序,10小于4.使用[[ $lines -gt 4 ]]((lines > 4))以获得数字比较。

+0

这解决了我的问题,也我不知道的问题存在。非常感谢!我会记住未来的cron PATH。 – user1204032