如何使 shell 脚本递归?

如何使 shell 脚本递归?

我有来自 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 解释器。这些东西真的需要每分钟运行多次吗?它到底起什么作用?

相关内容