用于清理Linux服务器会话文件夹的Bash脚本

时间:2016-06-03 16:47:02

标签: bash find

我正在管理一个Plesk Linux网络服务器,其中包含多个网站订阅,这些订阅都在FastCGI中运行。设置要求我为每个订阅都有一个会话文件夹(PHP将会话数据写入该文件夹)。问题是,随着时间的推移,这些会话文件夹会变满,并且不会自动清除。

我的托管服务提供商因此创建了以下脚本,该脚本将在cron作业中每周运行一次。

#!/bin/bash

mapfile -t domains < /home/cmadmin/domains

for i in "${domains[@]}"
do
 #echo "Deleting $i Session folder content"
 find /var/www/vhosts/$i/session/* -mtime +7 -type f -delete
done

该脚本的目标是遍历我的服务器上的每个订阅,进入该订阅的特定会话文件夹,并删除所有超过7天的文件。

此脚本似乎工作正常,但由于某种原因,当它到达名为groepsmanager-rspo.com的订阅时,该文件夹中的所有内容都将被删除。因此,即使会话文件夹之外的文件(例如/var/www/hosts/groepsmanager-rspo.com/httpdocs//var/www/hosts/groepsmanager-rspo.com/logs)也会被删除。

非常奇怪的是,所有其他订阅都完全正常。在调查他们的内容时,实际上只剩下7天以下的文件。

首先我们认为文件夹名称中的短划线( - )可能会导致问题,但情况并非如此,因为带有短划线的其他文件夹名称都可以。此外,全局会话文件夹外的文件夹中没有名为session的文件。

有没有人知道为什么这个特定的订阅会被删除?有没有做或不记得?

提前致谢。

2 个答案:

答案 0 :(得分:1)

你应该总是引用变量和参数;否则任何特殊字符都可能被shell误解。同样,find的第一个参数是路径;不需要通配符。如果我这样做,我会尝试这样的事情:

#!/bin/bash

mapfile -t domains < /home/cmadmin/domains

for i in "${domains[@]}"; do
    #echo "Deleting $i Session folder content"
    cd "/var/www/vhosts/$i/session/" || continue
    find . -mtime +7 -type f -delete
done

答案 1 :(得分:1)

我打赌你在文件/home/cmadmin/domains中有混合的行结尾。即所有其他行都有Unix行结束(LF)但有问题的行有Windows行结束(CRLF)。要验证这一点,您可以运行file /home/cmadmin/domains

要解决此问题,请运行dos2unix /home/cmadmin/domains。您应该仍然注意引用@miken32建议的引用。我热烈建议使用shellcheck,以便轻松发现引用问题。