crontab 任务中 Shell 脚本 for 循环不生效的问题原因与解决

今天老王在看自己的备份日志时,发现一个很奇怪的问题,自己备份脚本里的 for 循环居然没有生效。在测试写好的 Shell 脚本时,一切都是正常的,但是在写进 crontab 定时任务里时,就出现了这个 for 循环不生效的问题,下面分享下可能的原因和解决方法。

一、相关阅读

关于 crontab 和循环日期操作可以参考之前的运维笔记:

二、问题分析与解决

其实备份脚本很简单,就是过一段时间删除下之前的备份数据:

DATE=$(date +%Y%m%d)
for i in {1..5}
do
    DATE_TMP=$(date -d "${DATE} ${i} days ago" "+%Y%m%d")
    cd /root/backup
    rm -rf *${DATE_TMP}*
done

这个 Shell 脚本直接运行是没有问题的,我也加入到了 crontab 定时任务中(每 10 天执行一次):

30 22 */10 * * /root/clear_10_days.sh >> /root/clear_10_days.log 2>&1

但是看它清理的日志时,发现那个 for 循环并没有向我想的那样 i 是从 1 到 5 循环,而是根本没有效果。

网站找了点教程,有一句评论似乎有一点靠谱“I assume you use bash and you use sh in the script. ”,于是看了下 sh 和 bash(whereis sh bash),确实不是一个东西:

sh: /bin/sh /bin/sh.distrib /usr/share/man/man1/sh.1.gz
bash: /bin/bash /etc/bash.bashrc /usr/share/man/man1/bash.1.gz

所以猜想出现这个问题的原因直接命令行运行是通过 bash 执行脚本的,但是 crontab 里则是默认用 sh 执行的。

知道问题的原因,解决办法就很简单了,经测试两个都有效:

1.添加 #/bin/bash 声明

在脚本最上面添加声明:

#!/bin/bash
DATE=$(date +%Y%m%d)
for i in {1..5}
do
    DATE_TMP=$(date -d "${DATE} ${i} days ago" "+%Y%m%d")
    cd /root/backup
    rm -rf *${DATE_TMP}*
done

2.显示调用 bash 执行脚本

在 crontab 命令显示调用 bash:

30 22 */10 * * bash /root/clear_10_days.sh >> /root/clear_10_days.log 2>&1

写代码不规范,运维两行泪,因为写 Shell 基本懒得声明 #/bin/bash,所以出现了这个 for 循环不生效的问题。

赞(0)
关注我们
未经允许不得转载:老王博客 » crontab 任务中 Shell 脚本 for 循环不生效的问题原因与解决

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址