如何使shell脚本recursion?

我从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每分钟执行的,但是我需要使其recursion,即完成脚本并重复它自己。

我试图在最后一行添加这个:

 sh /usr/local/ispconfig/server/server.sh 

但由于某种原因,在几分钟内消耗所有的内存。

我该如何解决呢?

当你像最后一样调用它的时候,你永远不会让父母完成,并将使用你所有的进程分配和/或内存。 你可以用exec来代替你的当前进程,

 exec sh /usr/local/ispconfig/server/server.sh 

这样,你现在的过程将被一个新的副本取代,而不是有一个不断增长的儿童链。

我想你真正想要的是无限循环重复脚本。

所以,我build议循环使用它,而不是recursion地( 非常糟糕的想法,正如你发现的那样)

 !/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 

通过这种方式,您done立即无止境地重复所做的一切。

也就是说,你必须小心,因为这会对你的系统产生很大的影响,因为你一直在为新的PHP解释器工作。 这种东西真的需要每分钟多跑一次吗? 它究竟做了什么?