我有来自 ISPConfig 的这个 shell 脚本:
#!/bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin
. /etc/profile
umask 022
if [ -f /usr/local/ispconfig/server/lib/php.ini ]; then
PHPINIOWNER=`stat -c %U /usr/local/ispconfig/server/lib/php.ini`
if [ $PHPINIOWNER == 'root' ] || [ $PHPINIOWNER == 'ispconfig' ]; then
export PHPRC=/usr/local/ispconfig/server/lib
fi
fi
cd /usr/local/ispconfig/server
/usr/bin/php -q /usr/local/ispconfig/server/server.php
cd /usr/local/ispconfig/security
/usr/bin/php -q /usr/local/ispconfig/security/check.php
该脚本每分钟由 cron 执行一次,但我需要使其递归,即完成脚本并重复自身。
我尝试在最后一行添加以下内容:
sh /usr/local/ispconfig/server/server.sh
但由于某种原因,几分钟内就消耗了所有内存。
我该如何解决它?
答案1
当您通过在末尾调用它来进行递归时,您永远不会让父进程完成,并且将使用所有进程分配和/或内存。exec
不过,您可以使用它的新实例替换当前进程:
exec sh /usr/local/ispconfig/server/server.sh
这样,您当前的进程就会被一个新的副本所取代,而不是拥有不断增长的子链。
答案2
我猜你真正想要的是无限循环地重复该脚本。
因此,不要以递归方式执行此操作(真的坏主意,正如你所发现的)或者exec
,我建议循环它:
!/bin/sh
PATH=/sbin:/usr/sbin:/bin:/usr/bin:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin
. /etc/profile
umask 022
if [ -f /usr/local/ispconfig/server/lib/php.ini ]; then
PHPINIOWNER=`stat -c %U /usr/local/ispconfig/server/lib/php.ini`
if [ $PHPINIOWNER == 'root' ] || [ $PHPINIOWNER == 'ispconfig' ]; then
export PHPRC=/usr/local/ispconfig/server/lib
fi
fi
while :
do
cd /usr/local/ispconfig/server
/usr/bin/php -q /usr/local/ispconfig/server/server.php
cd /usr/local/ispconfig/security
/usr/bin/php -q /usr/local/ispconfig/security/check.php
done
这样,您可以立即、无休止地重复do
和之间的所有事情done
。
尽管如此,你必须小心,因为即使这样也会对你的系统产生很大的影响,因为你一直在分叉新的 PHP 解释器。这些东西真的需要每分钟运行多次吗?它到底起什么作用?