如何在 cron 中定期删除某些文件?
我正在尝试删除 PHP 会话目录中超过 15 分钟的空文件。我尝试了几种方法,但都失败了,并显示不同的错误消息。
4-59/10 * * * * root [ -d /var/lib/php/sessions ] && find /var/lib/php/sessions/ -type f -cmin +15 -size 0c -print0 | xargs -n 200 -r -0 rm
xargs 找不到“rm”。它也找不到“/bin/rm”。
4-59/10 * * * * root [ -d /var/lib/php/sessions ] && find /var/lib/php/sessions/ -type f -cmin +15 -size 0c -exec rm '{}'
缺少 -exec 选项的参数。
4-59/10 * * * * root [ -d /var/lib/php/sessions ] && find /var/lib/php/sessions/ -type f -cmin +15 -size 0c -delete
-delete 选项未知,查找的必须是旧的。
Ubuntu 16.04 还能这样做吗? 第一个提到的版本在 14.04 上运行良好。 如果 cron 可以做到这一点,也许我必须创建一个单独的 shell 脚本文件,并将其名称写入 cron 配置中。 上述所有命令在交互式 bash shell 中都可以正常工作(也许除了最后一个命令)。 只是在 cron 中不行。
答案1
为了避免处理 的cron
命令行语法,不要将命令放在 中crontab
。为命令编写一个简单的bash
包装器,然后从 调用脚本crontab
。此包装器将允许您设置环境($PATH
)、I/O 重定向、错误处理……
另外,我注意到您正在使用crontab
的root
特殊格式 ( /etc/crontab
, /etc/cron.d/
, /etc/cron.daily/
, /etc/cron.hourly/
, /etc/cron.monthly/
, /etc/cron.weekly/
) 设置。这是您的意图吗?还是您正在使用sudo crontab
?我不建议这样做。
你有:
[ -d /var/lib/php/sessions ] && find /var/lib/php/sessions/ -type f -cmin +15 -size 0c -print0 | xargs -n 200 -r -0 rm
你需要:
[ -d /var/lib/php/sessions ] && /usr/bin/find /var/lib/php/sessions/ -type f -cmin +15 -size 0c -print0 | /usr/bin/xargs -n 200 -r -0 /bin/rm
你有:
[ -d /var/lib/php/sessions ] && find /var/lib/php/sessions/ -type f -cmin +15 -size 0c -exec rm '{}'
您需要一个转义的分号(“ \;
”)来终止-exec
:
[ -d /var/lib/php/sessions ] && /usr/bin/find /var/lib/php/sessions/ -type f -cmin +15 -size 0c -exec rm '{}' \;
“find
一定很老了”?find --version
看起来像:
$ find --version
find (GNU findutils) 4.7.0-git
Copyright (C) 2016 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Written by Eric B. Decker, James Youngman, and Kevin Dalley.
Features enabled: D_TYPE O_NOFOLLOW(enabled) LEAF_OPTIMISATION FTS(FTS_CWDFD) CBO(level=2)
你运行的是哪个版本的 Ubuntu?find ... -delete
已经存在很长时间了。你是吗BusyBox
?
下面是我用来说明一些问题的脚本cron
:
(我的环境使用$HOME/bin
和$HOME/var/log
):
在 $HOME/bin/recordenv 中:
#!/bin/bash
# Record the environment that a job enjoys
# $1 is the "type" (cron, at, batch, gui, text) are suggested values.
# $1 is NOT validated. Output goes to ${HOME}/var/log/{env,set,alias}.$1
if [[ "$1" ]] ; then
ext="$1"
env | sort >${HOME}/var/log/env.$ext
set >${HOME}/var/log/set.$ext
alias >${HOME}/var/log/alias.$ext
/bin/ls -l ${HOME}/var/log/env.$ext ${HOME}/var/log/set.$ext ${HOME}/var/log/alias.$ext
else
echo "User error."
exit 1
fi
要使用它,请$HOME/bin/recordenv cron
从调用crontab
。