【发布时间】:2012-02-15 02:11:36
【问题描述】:
我在命令行中运行脚本很好,但在放入 cronjob 时它会失败。我已将其范围缩小到使用 [ -e "name" ] 测试文件存在的具体问题。通过在 Ubuntu 32 位桌面上运行,我可以编写以下脚本并在从命令行调用时让它工作:
#!/bin/bash
# define statements
IMPORT="/home/${USER}/data_imports/fitb"
ARCHIVE="${IMPORT}/archive"
declare -a CENTERS
CENTERS[0]="ct"
CENTERS[1]="ny"
len=${#CENTERS[*]}
RUNDATE=`date --date=yesterday +"%m%d"`
ARCHIVEDATE=`date --date=yesterday +"%Y_%m_%d"`
i=0
while [ $i -lt $len ]; do
if [ -e "${ARCHIVE}/fitb_${ARCHIVEDATE}_${CENTERS[i]}.csv" ]
then touch ~/data_imports/fitb/shell_${i}.rn
fi
let i++
done
如果我在将 touch 命令放在自己的行后注释掉“if”、“then”和“fi”行,则 while 循环在 cronjob 中运行良好。如果我把 if 测试放回去,我什么也得不到。为了测试它是否被 cron 守护程序拾取,我将 touch 命令移至 shebang 之后的行,因此它是第一个运行的命令。这无法产生任何东西。我知道使用 -e 测试的文件位于正确的位置,并具有全局 rx 权限。难道 -e 需要 +w 才能使测试成功吗?我认为这可能是由于子shell没有继承变量(据我了解,其中的 tst 是一种),但是如果是这样的话,我认为 CLI 调用也会失败。
【问题讨论】:
-
10 次中有 9 次,如果 cronjob 不起作用(但脚本在交互式会话中起作用),则某些环境变量存在问题。
-
尝试将您正在测试的文件回显到 /tmp/blah 或其他内容中,然后从 cron 运行它以查看这是否是您期望的文件。如果不是,则可能是 asf107 建议的环境变量