【问题标题】:Script working fine from command line, but not from crontab脚本从命令行工作正常,但不能从 crontab
【发布时间】:2013-08-31 20:40:00
【问题描述】:

我作为“ins”用户的 crontab 条目是这样的:

* * * * * /usr/bin/ksh /apps/swbkp/swbkp.sh

脚本是:

#! /usr/bin/ksh

. /apps/ins/.profile

cdate=$(date +'%y%m%d')

/apps/omni/bin/swmml -e "backup-node:" >> /apps/swbkp/swerrr1.$cdate

#
if [[ -f /apps/omni/conf/archive.C7M3UAA.500.$cdate ]]
then
   mv -f /apps/omni/conf/archive.C7M3UAA.500.$cdate /apps/swbkp/
elif [[ -f /apps/omni/labeir1/dffile/archive.C7M3UAA.500.$cdate ]]
then
   mv -f /apps/omni/labeir1/dffile/archive.C7M3UAA.500.$cdate /apps/swbkp/
else
   printf "Backup archive File not present to move"
fi >> /apps/swbkp/swerrr1.$cdate
#

注意:/apps/omni/bin/swmml -e "backup-node:" 这一行只是在我的系统上创建了一个archive.C7M3UA.500.<current date> 类型的备份文件

发生了 2 件奇怪的事情:

  1. 生成的备份文件为:

    -rw-r--r-- 1 root root 165 Aug 28 21:55 /apps/omni/labeir1/dffile/archive.C7M3UAA.500.130828

当移动到/apps/swbkp 时,时间戳是前 1 分钟:

-rw-r--r-- 1 root root  165 Aug 28 21:54 archive.C7M3UAA.500.130828
  1. 没有任何东西被重定向到/apps/swbkp/swerrr1.$cdate 文件

    -rw-r--r-- 1 ins 0 8 月 28 日 21:24 swerrr1.130828

而当我从终端运行脚本时,一切正常,即文件在备份文件夹和移动文件夹中具有相同的时间戳,并且输出也记录在日志文件中。

请帮忙

【问题讨论】:

  • 似乎有别的东西正在写入这个文件/apps/omni/labeir1/dffile/archive.C7M3UAA.500.130828,而它正在被移动。我会在两者之间进行md5 检查。什么都不会被重定向,因为它没有达到最终的else 条件。
  • @iamauser no ,脚本在独立运行时会给出“备份完成”消息,该消息被重定向到日志文件,这只是在 crontab 中不会发生

标签: linux shell scripting crontab


【解决方案1】:

查看/apps/ins/.profile 及其执行的文件 - 此类文件通常有一个条件,即如果脚本未在终端中运行,则提前退出脚本。

例如:

[ -z "$PS1" ] && return

这可能会改变脚本的行为(如果使用exit 代替return,甚至可以跳过它)。至少,您会错过别名、可能的 PATH 更改以及在 .profile 脚本中设置的其他内容,这将影响您的主脚本是否以及如何运行。

尝试在上面的脚本中注释. /apps/ins/.profile 行,看看它是否仍然在终端中运行。如果是这样,请从 crontab 中运行它,看看它是否能解决您的问题。

【讨论】:

    【解决方案2】:

    这可能已经得到解答,但对于任何寻求帮助的人:

    在 crons 中使用日期/时间戳时,您需要像下面这样转义“百分比”:

    cdate=$(date +'\%y\%m\%d') instead of cdate=$(date +'%y%m%d')

    如果在 yaml/Ansible 剧本中使用它,您需要双重转义或转义转义,例如:

    $(date +'\\%y\\%m\\%d')

    最终,cron 应该看起来像

    * * * * * script.sh > /tmp/script_$(date +\%y\%m\%d).log 2>&1

    【讨论】: