如果我从/home/<user>/<dir>/script.sh
以root身份运行脚本,那么cron的效果非常好。但是,如果我从/root/<dir>/script.sh
(再次以root身份)运行脚本,则cron似乎不起作用。
答案 0 :(得分:3)
在使用'cron'时,在过去与各种默认$ PATH发生冲突时,我总是拼写每个可执行文件和每个目标文件的绝对$ PATH。我总是认为'cron'设置了NO $ PATH并且没有当前工作目录。
换句话说,不要使用像
这样的命令 "myprocess abc*.txt"
但完全像
一样 "/usr/localbin/myprocess /home/jvs/abc*.txt".
或者,创建一个执行该作业的bash脚本,并使用完整的绝对路径调用该bash脚本,例如
"/usr/local/bin/myprocess_abc_txts".
如果您需要在脚本中具有一定的灵活性,请使用在您使用“cron”调用的bash脚本中专门设置的环境变量。
答案 1 :(得分:2)
我认为您需要添加更多信息。我猜它是权限的东西。在crontab中添加文件,目录和行的权限,以便我们提供帮助。另外,如果你把它放在/ root中,你是否在root的crontab中运行它?
答案 2 :(得分:2)
记住环境 - 特别是在由cron
而不是由root运行时。当cron运行某些东西时,你可能没有任何环境设置,这与通过at
运行命令不同。目前还不清楚当前目录是什么。因此,对于将由cron
运行的命令,请使用脚本(正如您已经在做的那样)并确保它设置足够的环境以使其运行。并确保您的环境设置代码不是交互式的!
在我的机器上,我有一个机制,使得cron条目读取(例如):
23 1 * * 1-5 /usr/bin/ksh /work1/jleffler/bin/Cron/weekday
weekday
目录中的Cron
脚本是指向首先设置环境然后运行命令/work1/jleffler/bin/weekday
的标准脚本的链接(在这种情况下 - 它使用的名称为确定要运行的命令。
Cron
目录中的实际脚本是:
: "$Id: runcron.sh,v 2.1 2001/02/27 00:53:22 jleffler Exp $"
#
# Commands to be performed by Cron (no debugging options)
# Set environment -- not done by cron (usually switches HOME)
. $HOME/.cronfile
base=`basename $0`
cmd=${REAL_HOME:-/real/home}/bin/$base
if [ ! -x $cmd ]
then cmd=${HOME}/bin/$base
fi
exec $cmd ${@:+"$@"}
我已经使用了一段时间 - 自2001年以来这个版本 - 它对我有用。我正在使用cron
的基本(Sun Solaris 10)实现;在其他平台上cron
的新版本中可能有新功能,以使其中一些不必要。 ($REAL_HOME
的东西是我的一个奇怪的东西;假装它说$HOME
- 虽然这使得你不需要一些脚本。).cronfile
负责环境设置 - 它确实很多,但那是我的问题,不是你的问题。
答案 3 :(得分:0)
可能是因为你正在寻找脚本中的相对目录/文件,这些目录/文件是从/ home /而不是从/ root运行时找到的,因为/ root不在/ home / root中也不会看起来像/ home /
中的用户家庭文件夹您可以检查并查看是否正在查找相关文件,或发布脚本吗?
另外请注意,为什么不将它设置为从用户的主文件夹运行呢?
答案 4 :(得分:0)
运行sh脚本的另一种方法是将bash脚本放在/usr/bin
目录中,只需运行命令bash yourscript.sh
而不添加/usr/bin/
目录