【问题标题】:sh file not running on cron ubuntush 文件未在 cron ubuntu 上运行
【发布时间】:2016-03-21 06:26:17
【问题描述】:

我正在尝试在 Ubuntu 平台上的 crontab 上运行 shell 脚本。我试过谷歌搜索和其他链接,但到目前为止没有任何帮助。

这是我的crontab:

*/2 * * * *  sudo bash /data/html/mysite/site_cleanup.sh

这是我sh文件的内容:

#!/bin/sh
# How many days retention do we want ?
DAYS=0

# geting present day 
now=$(date +"%m_%d_%Y")

# Where is the base directory
BASEDIR=/data/html/mysite

#where is the backup directory
BKPDIR=/data/html/backup

# Where is the log file
LOGFILE=$BKPDIR/log/mysite.log

# add to tar 
tar -cvzf $now.tar.gz $BASEDIR

mv $now.tar.gz $BKPDIR

# REMOVE OLD FILES
echo `date` Purge Started >> $LOGFILE
find $BASEDIR -mtime +$DAYS | xargs rm
echo `date` Purge Completed >> $LOGFILE

相同的脚本从终端运行并给出所需的结果。

【问题讨论】:

  • 我猜你没有名为“sudo”的用户,如果这是/etc/crontab,请将sudo 替换为root。
  • 糟糕的是我没有保留任何 sudo,*/2 * * * * bash /data/html/mysite/site_cleanup.sh。谢谢保罗
  • 这个 crontab 文件在哪里?我的意思是,它是在/etc/ 下还是用crontab -e 编辑的?
  • 使用 crontab -e 编辑
  • xargs rm 很危险。并且以 root 身份运行脚本并不会使其更安全。请看BashFAQ 20

标签: linux bash shell ubuntu cron


【解决方案1】:

非交互式 shell 脚本的一般故障排除

将set -x; exec 2>/path/to/logfile 放在脚本顶部,以便在运行时将所有后续命令记录到文件中。如果这不起作用,您将知道您的脚本根本没有运行;如果确实如此,您就会知道它在哪里失败以及如何失败。

如果这是个人 crontab

如果您以用户身份运行crontab -e(没有sudo),那么正在修改的crontab 就是使用该用户权限运行的命令。检查文件权限是否允许该用户修改相关内容(如果这些文件位于 cgi-bin 目录中,则可能需要由与 Web 服务器相同的用户运行)。

如果您的意图是让命令以 root 身份运行,而不是以您自己的用户身份运行,请确保在编辑 crontab 时使用sudo 改为编辑系统 crontab(但请注意至于您的脚本在这种情况下的正确性——在使用 xargs 时,疏忽(例如缺少引号或缺乏适当的预防措施)可能会导致脚本在创建恶意文件名时删除错误的文件):

sudo crontab -e             ## to edit the system (root) crontab

...或者,如果您正在清理 apache 用户拥有的文件(例如;检查哪个帐户对于您自己的操作系统和 Web 服务器是正确的):

sudo -u apache crontab -e   ## to edit the apache user's crontab

系统 crontab 故障排除

不要尝试将sudo 命令置于cron 运行的命令中;使用sudo 的默认配置,它需要将 TTY(键盘和屏幕)附加到会话才能运行。因此,您的 crontab 行不应包含 sudo,而应如下所示:

*/2 * * * *  bash /data/html/mysite/site_cleanup.sh

【讨论】:

  • source 将使用 /bin/sh(除非 crontab 的标题中有 SHELL= 行),从而显着改变行为。
  • 重建,我认为不赞成票是因为这让我印象深刻的是问题列表而不是规范答案(其中一些不太可能富有成果;例如,以 root 身份运行的 cron 作业不是t 特别可能缺乏读取访问权限)。诚然,有时 OP 没有提供足够的信息来构建规范的答案,但鼓励向不充分的问题添加信息是 cmets 的用途。
  • 我已尝试编辑此内容以删除不确定相关性的问题并以更规范的语气说话。如果您认为我过于严厉,请随时回滚(和/或让我知道)。
【解决方案2】:

您的问题可能来自您的用户级 cron 的 sudo 调用。除非您已经完成并编辑了 bashrc 配置文件以允许该脚本在没有 sudo 的情况下运行,否则它每次都会挂断。

因此,您可以通过修改 bashrc 配置文件来查找如何在没有密码的情况下运行脚本,如果您没有在脚本中执行需要超级用户权限的操作,则删除 sudo 调用,或者作为最后一道防线,非常糟糕如果你喜欢 nano 作为编辑器,你可以通过 sudo crontab -e 或 sudo env EDITOR=nano crontab -e 从 root 的 cron 调用你的脚本。

【讨论】:

    【解决方案3】:

    尝试将此行添加到用户 root 的 crontab 中,并且不使用 sudo。 像这样:

    */2 * * * * bash /data/html/mysite/site_cleanup.sh
    

    【讨论】:

    • 如果脚本有适当的 hash-bang,bash 将毫无用处。
    • 好吧——bash 覆盖了 shebang,如果留给自己的设备,它将使用 /bin/sh 本身。
    猜你喜欢
    • 2021-02-10
    • 1970-01-01
    • 2017-06-05
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2021-11-07
    相关资源
    最近更新 更多