我是 Linux 新手。话虽如此,我需要一个 cronjob 在 48 小时后压缩一些 syslog 文件以使其大小易于管理。这些文件当前位于 /syslog - 我添加的一个用于处理卷的磁盘。我之前问过一个问题来处理这个问题,但之后我在这里,cronjob 没有运行。它应该在几个小时前运行。我相信该作业设置为每天 01:00:00 运行。这是我当前的 crontab。
root@mysyslogserver:/etc# more crontab
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
# m h dom mon dow user command
17 * * * * root cd / && run-parts --report /etc/cron.hourly
25 6 * * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.daily )
47 6 * * 7 root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.weekly )
52 6 1 * * root test -x /usr/sbin/anacron || ( cd / && run-parts --report /etc/cron.monthly )
0 1 * * * /bin/gzip /syslog/*-$(/bin/date --date='2 days ago' +%F)
我想知道格式是否让我陷入了困境?
在此先感谢您的帮助。
答案1
正如斯文所说,更好的解决方案是使用logrotate
或类似为此设计的工具。
但是,为了便于解释,有两个问题。
您没有指定 cron 应以哪个用户身份运行。
其次是%F
部分。
您需要转义 %,如下所述man 5 crontab
:
“第六个”字段(行的其余部分)指定要运行的命令。行的整个命令部分(直到换行符或 % 字符)将由 /bin/sh 或 cronfile 的 SHELL 变量中指定的 shell 执行。除非使用反斜杠 (\) 转义,否则命令中的百分号 (%) 将更改为换行符,并且第一个 % 之后的所有数据将作为标准输入发送到命令。
所以这:
0 1 * * * root /bin/gzip /syslog/*-$(/bin/date --date='2 days ago' +\%F)
应该管用。
答案2
您忘记添加运行该作业的用户,请更正:
0 1 * * * root /bin/gzip /syslog/*-$(/bin/date --date='2 days ago' +%F)