cronjob没有按预期工作

时间:2014-03-10 12:57:20

标签: linux shell sh

这是脚本arc_rem.sh(755权限),它在crontab中添加如下

  00 0,3,6,9,12,15,18,21 * *         * . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1

和脚本arc_rem.sh如下

  rm /BIAMD/arch01/usageprd/arch/old_arcs.log
  cd /BIAMD/arch01/usageprd/arch
  LGA=`sqlplus -s tcs384160/tcs#1234 <<\EOF
  set pagesize 0 feedback off verify off heading off echo off
  select max(sequence#) from v$archived_log;
  exit;
  EOF`
  echo $LGA;
  U_LIMIT=`expr $LGA - 35`;
  L_LIMIT=`expr $U_LIMIT - 1000`;
  echo $L_LIMIT;
  echo $U_LIMIT;
  LOOP_VAR=$L_LIMIT;
  while [ $LOOP_VAR -le $U_LIMIT ];
  do
   ls  /BIAMD/arch01/usageprd/arch/*_${LOOP_VAR}_*.arc   >> /BIAMD/arch01/usageprd/arch/old_arcs.log;
  LOOP_VAR=`expr $LOOP_VAR + 1`;
  done;
  rm `cat /BIAMD/arch01/usageprd/arch/old_arcs.log`

我尽可能包含绝对路径。

此脚本的此要求是删除早于序列的文件(上述脚本中的U_limit),它通过填充old_arcs.log并对该文件执行rm(最后一行代码)来实现此目的

注意到问题

1)每当cronjob以3小时的间隔执行它时,old_arcs的大小为0,因此没有文件被rm删除,但是当我手动执行时,脚本工作正常sh arcs_rem.sh它按预期填充old_arcs.log删除文件。

2) 当我在cronjob执行时执行ps -ef | grep sh时,o / p如下 它看起来像是同一个shell脚本的许多实例正在运行,不知道原因 并消耗更多的CPU

  oracle   473   455   1 21:00:00 ?         335:37 sh -  c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
  oracle   614   485   1 15:00:01 ?          30:01 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
  oracle  8278  8240   1 03:00:01 ?         150:37 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
  oracle 18331 18171   1 18:00:01 ?           2:36 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null
  oracle  1845  4464   0 06:00:01 ?           0:00 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1
  oracle  9887  9822   1 00:00:01 ?         189:59 sh -c . ./.cronprofile;/BIAMD/arch01/usageprd/arch/arch_rem.sh >/dev/null 2>&1

如果有人能告诉我脚本或crontab配置有什么问题以及解决方法,这将非常有用

编辑:

我已经检查了所有循环变量并且它们正在更新,这可能是无限循环的原因

1 个答案:

答案 0 :(得分:1)

  1. 您不应在cron作业命令中使用./.cronprofile之类的相对路径。
  2. ps输出看起来你的cron作业无限期地运行,或者至少持续很长时间。你应该检查一个无限循环。 Cron并不关心脚本在启动另一个脚本时是否已经在运行。只需在循环中打印$LOOP_VAR$U_LIMIT即可验证它们是否按预期更改。
  3. Use More Quotes™.
  4. Don't parse ls output.
  5. shell脚本命令 not 必须以;终止
  6. 您应该使用$()而不是``
  7. 在脚本顶部添加set -o errexit -o noclobber -o nounset以启用一些非常基本的错误处理。它们应该适用于任何POSIX shell