我被这个不起作用的 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
按此顺序检查的事项:
您的脚本是否以非交互方式从命令行运行并具有确切的所有者设置?
sudo -H -u user -- command
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
与此同时,我已经为另一台摄像机创建了另一个,并且工作得很好。