【问题标题】:Ubuntu 10.04: Bash script fails in cronjob when [-e ] test is usedUbuntu 10.04:使用 [-e] 测试时,Bash 脚本在 cronjob 中失败
【发布时间】: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 建议的环境变量

标签: bash testing ubuntu cron


【解决方案1】:

您似乎依赖于 ${USER} 的定义。当作为 cronjob 运行时,情况并非如此。

【讨论】:

  • 在阅读了一些关于 bash 测试的内容后,我想到了这一点,但我通过接触 ${IMPORT}/shell_${i}.rn 进行了测试。我不知道我在测试它时搞砸了什么,但这似乎是问题所在。有可能我已将 USER=whoami 放入其中,因为 cron 作业现在运行良好。谢谢。
猜你喜欢
  • 2015-04-18
  • 2011-05-15
  • 2012-09-12
  • 2020-11-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多