为什么 source 命令在使用包含 cd 命令的 shell 脚本的 crontab 中不起作用?

为什么 source 命令在使用包含 cd 命令的 shell 脚本的 crontab 中不起作用?

我制作了一个名为 的脚本purging.sh。我在该脚本中使用了cd命令,并且该脚本多次更改目录,因此我为该cd命令分配了一些变量,这反过来又有助于更改目录。

cd /home/parthipan/test/wireshark/$a/$b

要运行脚本,我必须使用source ./purging.shor . ./purging.sh

但我必须安排我正在使用 crontab 的脚本,

10 01 * * * . /home/parthipan/test/purging.sh

我的脚本的开始:

#!/bin/bash
a=$( date -d "`date` -60 days" "+%Y%m%d" | cut -b 1-4 )
b=$( date -d "`date` -60 days" "+%Y%m%d" | cut -b 5-6 )
c=$( date -d "`date` -60 days" "+%Y%m%d" | cut -b 7-8 )
cd /home/parthipan/test/wireshark/$a/$b
d=$( ll | awk -F " " '{print $9}' | awk -v value=$c '$1 < value' | sed "/^$/d" | xargs )
echo "The Days archiving are: $d"
e=$( ll | awk -F " " '{print $9}' | awk -v value=$c '$1 < value' | sed "/^$/d" | wc -l )
f=$( date -d "`date` - 61 days" "+%Y%m%d" | cut -b 5-8 )
if (( $e > 0 ))
        then
                tar --no-overwrite-dir -czvf backup_$f.tar.gz $d
                mv backup_$f.tar.gz /home/parthipan/test/logs_backup
                #rm -rf $d
                logger Data has been purged

上面的脚本将继续执行,命令结束fi。它通常可以在 cli 上运行,但不能在 crontab 上运行。我在最后一行使用了 logger 命令,以便消息将打印在/var/log.
但消息打印是,

May  1 00:50:01 parthipan-nadar systemd: Started Session 24 of user root.

之后就没有其他日志形式了。但所需的日志应该是Data has been purged.

答案1

当您在 shell 中获取它时它就可以工作,因为您似乎ll在脚本中使用了您的别名。从 cron 执行的脚本没有您的环境,因此您需要更明确地设置PATH(如果您调用位于/bin或之外的可执行文件/usr/bin),而不是依赖于您的特定别名或环境变量。如果您的 ll别名是 的别名ls -l,则改用ls -l(但请参阅下面的第一点)。

其他一些评论:

  • 不解析 ls。如果您需要根据年龄过滤文件,请使用statfind.

  • 您不需要在日期调用中嵌套日期调用:使用-d "60 days ago"

  • 不要仅仅为了获取年月日而调用 date 6 次(!!):

    read -r year month day < <(date -d "60 days ago" "+%Y %m %d")
    
  • 使用描述性变量名称。a b c...很糟糕。

相关内容