crontab 不工作或脚本错误?

crontab 不工作或脚本错误?

我被这个不起作用的 cronjob 困住了。我把它留了一天,用一些新的想法再次解决它,但仍然没有运气。

我试图在这个伟大的问题上找到我的答案邮政,但并不是所有事情都对我来说很清楚,最后它仍然无法工作。更糟糕的是,/var/log 中没有任何日志,也没有关于 cron 的错误。

我要努力实现什么目标?
自动删除由网络摄像机填充的目录。目录中是快照。这是列表的视图。

pi@raspberrypi:/media/pi/USB/Dahua/Dahua $ ll
total 24K
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  2 05:59 2018-09-02d
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  3 00:57 2018-09-03d
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  4 02:03 2018-09-04d
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  5 01:20 2018-09-05d
drwxr-xr-x 3 xxxxxxxx xxxxxxxxx 4.0K Sep  6 00:20 2018-09-06
-rw-r--r-- 1 xxxxxxxx xxxxxxxxx 4.0K Sep  6 22:28 DVRWorkDirectory

我想保留 x 最新的文件并删除其余的。所有这一切都通过一个可以每周或每天在某个时间运行的 cronjob 来实现。

看起来并不困难,但我就是无法让它发挥作用。确实,我的 Linux 知识很基础,并且可能是我的问题的原因。


第 1 步:我的脚本、权限和文件位置。

在我的研究中,我发现这三个主题非常重要。所以这应该是有价值的信息。

-rwxr--r-- 1 root staff 183 Sep  6 15:22 dahuapurge.sh

/usr/local/bin

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#
#
#Keep the Dahua pics for max x time.
cd /media/pi/USB/Dahua/Dahua/
sudo rm -rf `ls -tl | tail -n +8`

第 2 步:我的 cronjob 配置。

为了创建 cronjob,我使用了命令 crontab -e。在文件中,除了我手动编写的规则之外,每一行都被注释。我知道,我暂时将其设置为每小时运行一次。

# AUTHOR: - xxxx xxxx
# DATE:   - 31/08/2018
# DESCR:  - Purge Cam pics
# LINK: -
#
0 * * * * /usr/local/bin/dahuapurge.sh

更新:
我可能发现了我的错误之一,或者可能是这个错误。但我的帖子离我还很远,所以我还是分享它。
我将选项 -rf 添加到 rm 命令中,因为我尝试删除目录而不是文件。我修改了我的脚本,它应该会在大约 30 分钟内再次删除 1 个目录。

#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
#
#
#Keep the Dahua pics for max x time.
cd /media/pi/USB/Dahua/Dahua/
sudo rm -rf `ls -tl | tail -n +7`

更新:
仍然不起作用,但我会尝试发布的建议并尽快更新。

答案1

按此顺序检查的事项:

  1. 您的脚本是否以非交互方式从命令行运行并具有确切的所有者设置?

    sudo -H -u user -- command
    
  2. crontab 条目语法正确吗?请注意,系统范围的 crontab 还有另一列。重新启动而不是重新加载 cron 服务,那么/var/log/syslog如果 crontab 有错误,您应该收到相应的错误消息:

     Sep  6 15:56:50 myhost cron[834]: (CRON) STARTUP (fork ok)
     Sep  6 15:56:50 myhost cron[834]: Error: bad command; while reading /etc/crontab
     Sep  6 15:56:50 myhost cron[834]: (*system*) ERROR (Syntax error, this crontab file will be ignored)
    

crontab 包含一个MAILTO指向邮件地址的变量。通过这种方式,您可以调试您的脚本。每当脚本向 stdout 或 stderr 输出某些内容时,其内容都会被邮寄到该地址。为此,需要 MTA(邮件传输代理)。看一看这里


另一件事:将 的输出传递ls给命令是一种设计反模式。删除*.jpg超过 5 天的文件(非递归),如下所示:

find /path -maxdepth 1 -type f -name '*.jpg' -ctime +5 -delete

有关更多详细信息,请参阅man 1 find

答案2

简而言之,然后是命令的输出:

1/就像几个人建议的那样,我停止解析 ls。特别是当使用 with 时rm -rf,我现在明白为什么了。我不得不使用exec rm -rf,因为删除不适用于“非”空目录。

2/crontab -e在根帐户下创建了我的操作(使用sudo su)。

3/我更改了脚本的权限(也允许其他组使用 执行chmod 756 file)。

文件权限:

root@raspberrypi:/usr/local/bin# ls -l
total 8
-rwxr-xr-- 1 root staff 146 Sep  7 10:13 dahuapurge.sh

脚本:

#!/bin/bash
#
#
#Keep the most recent Dahua pics.
find /media/pi/USB/Dahua/Dahua/ -maxdepth 1 -type d -name '20*' -mtime +10 -exec rm -rf {} +

crontab 最后几行:

# AUTHOR: - xxxxx xxxx 
# DATE:   - 31/08/2018
# DESCR:  - Purge Cam pics
# LINK:   -
0 1 * * * /usr/local/bin/hikvisionpurge.sh
0 2 * * 2 /usr/local/bin/dahuapurge.sh


与此同时,我已经为另一台摄像机创建了另一个,并且工作得很好。

相关内容