Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/287.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用linux ps命令检查已运行的脚本实例数_Php_Shell_Cron - Fatal编程技术网

Php 使用linux ps命令检查已运行的脚本实例数

Php 使用linux ps命令检查已运行的脚本实例数,php,shell,cron,Php,Shell,Cron,我有一个cron作业,大约需要5分钟才能完成,而且它设置为每分钟运行一次。 我知道脚本执行得更快,因为它会终止,但这是故意的。 我想让这个脚本的大约5个实例同时运行,但现在,服务器将运行太多的实例,直到一切冻结 这就是为什么我想在每个cron的开头执行一个检查,检查有多少实例已经在运行,如果已经有5个以上的实例在运行,则立即终止 我怎样才能最有效地做到这一点 我在网上找到了这个片段,这可能是一个很好的解决方案: exec("ps auxwww|grep cleaner.php|grep -v g

我有一个cron作业,大约需要5分钟才能完成,而且它设置为每分钟运行一次。 我知道脚本执行得更快,因为它会终止,但这是故意的。 我想让这个脚本的大约5个实例同时运行,但现在,服务器将运行太多的实例,直到一切冻结

这就是为什么我想在每个cron的开头执行一个检查,检查有多少实例已经在运行,如果已经有5个以上的实例在运行,则立即终止

我怎样才能最有效地做到这一点

我在网上找到了这个片段,这可能是一个很好的解决方案:

exec("ps auxwww|grep cleaner.php|grep -v grep", $output);
print_r($output);
cleaner.php
是有问题的脚本

如果执行此脚本,将获得以下输出:

    Array
(
    [0] => root      4565  0.0  0.0   6184   776 ?        SNs  15:42   0:00 jailshell (user1) [4732] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [1] => user1  4732  0.0  0.0   6184   396 ?        SN   15:42   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [2] => user1  4733  0.0  0.0 106056  1264 ?        SN   15:42   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [3] => user1  4734  0.0  0.3 366452 15988 ?        SN   15:42   0:00 php /home/user1/public_html/crons/cleaner.php
    [4] => root      4776  0.0  0.0   6184   776 ?        SNs  15:44   0:00 jailshell (user1) [4793] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [5] => user1  4793  0.0  0.0   6184   396 ?        SN   15:44   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [6] => user1  4794  0.0  0.0 106056  1264 ?        SN   15:44   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [7] => user1  4795  0.0  0.3 366452 16008 ?        SN   15:44   0:00 php /home/user1/public_html/crons/cleaner.php
    [8] => root      6111  0.0  0.0   6184   776 ?        SNs  15:46   0:00 jailshell (user1) [6126] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [9] => user1  6126  0.0  0.0   6184   396 ?        SN   15:46   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [10] => user1  6127  0.0  0.0 106056  1264 ?        SN   15:46   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [11] => user1  6128  0.0  0.3 366452 15920 ?        SN   15:46   0:00 php /home/user1/public_html/crons/cleaner.php
    [12] => root      6218  0.0  0.0   6184   776 ?        SNs  15:48   0:00 jailshell (user1) [7368] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [13] => user1  7368  0.0  0.0   6184   396 ?        SN   15:48   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [14] => user1  7369  0.0  0.0 106056  1260 ?        SN   15:48   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [15] => user1  7370  0.0  0.3 366452 15960 ?        SN   15:48   0:00 php /home/user1/public_html/crons/cleaner.php
    [16] => root      7462  0.0  0.0   6184   776 ?        SNs  15:50   0:00 jailshell (user1) [7704] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [17] => user1  7704  0.0  0.0   6184   396 ?        SN   15:50   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [18] => user1  7705  0.0  0.0 106056  1256 ?        SN   15:50   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [19] => user1  7706  0.0  0.3 366452 15960 ?        SN   15:50   0:00 php /home/user1/public_html/crons/cleaner.php
    [20] => root     11969  0.0  0.0   6184   772 ?        SNs  15:52   0:00 jailshell (user1) [11987] ll -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [21] => user1 11987  0.0  0.0   6184   392 ?        SN   15:52   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [22] => user1 11992  0.0  0.0 106056  1264 ?        SN   15:52   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [23] => user1 11993  0.2  0.3 366452 15888 ?        SN   15:52   0:00 php /home/user1/public_html/crons/cleaner.php
    [24] => root     24158  0.0  0.0   6184   780 ?        SNs  15:30   0:00 jailshell (user1) [24232] ll -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [25] => user1 24232  0.0  0.0   6184   400 ?        SN   15:30   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [26] => user1 24254  0.0  0.0 106056  1264 ?        SN   15:30   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [27] => user1 24260  0.0  0.3 366448 15952 ?        SN   15:30   0:00 php /home/user1/public_html/crons/cleaner.php
    [28] => root     28649  0.0  0.0   6184   772 ?        SNs  15:32   0:00 jailshell (user1) [29645] ll -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [29] => user1 29645  0.0  0.0   6184   392 ?        SN   15:32   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [30] => user1 29647  0.0  0.0 106056  1264 ?        SN   15:32   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [31] => user1 29648  0.0  0.3 366452 15972 ?        SN   15:32   0:00 php /home/user1/public_html/crons/cleaner.php
    [32] => root     29821  0.0  0.0   6184   776 ?        SNs  15:34   0:00 jailshell (user1) [29840] ll -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [33] => user1 29840  0.0  0.0   6184   396 ?        SN   15:34   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [34] => user1 29843  0.0  0.0 106056  1260 ?        SN   15:34   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [35] => user1 29845  0.0  0.3 366452 15984 ?        SN   15:34   0:00 php /home/user1/public_html/crons/cleaner.php
    [36] => root     30055  0.0  0.0   6184   776 ?        SNs  15:36   0:00 jailshell (user1) [30090] ll -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [37] => user1 30090  0.0  0.0   6184   396 ?        SN   15:36   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [38] => user1 30101  0.0  0.0 106056  1260 ?        SN   15:36   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [39] => user1 30108  0.0  0.3 366452 15968 ?        SN   15:36   0:00 php /home/user1/public_html/crons/cleaner.php
    [40] => root     31311  0.0  0.0   6184   776 ?        SNs  15:38   0:00 jailshell (user1) [31332] ll -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [41] => user1 31332  0.0  0.0   6184   396 ?        SN   15:38   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [42] => user1 31333  0.0  0.0 106056  1260 ?        SN   15:38   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [43] => user1 31336  0.0  0.3 366452 15976 ?        SN   15:38   0:00 php /home/user1/public_html/crons/cleaner.php
    [44] => root     31610  0.0  0.0   6184   776 ?        SNs  15:40   0:00 jailshell (user1) [31675] ll -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [45] => user1 31675  0.0  0.0   6184   396 ?        SN   15:40   0:00 jailshell (user1) [init] ell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [46] => user1 31680  0.0  0.0 106056  1260 ?        SN   15:40   0:00 /usr/local/cpanel/bin/jailshell -c php /home/user1/public_html/crons/cleaner.php >/dev/null 2>&1
    [47] => user1 31685  0.0  0.3 366452 15972 ?        SN   15:40   0:00 php /home/user1/public_html/crons/cleaner.php
)
现在我有点困惑,有些实例是在
user1
下运行的,有些是在
root
下运行的,还有关于监狱的

上面哪一行的输出意味着脚本当前执行了1次,或者脚本当前确实执行了48次?我想需要更多的过滤


这是我想要实现的最好的解决方案吗?

我没有使用cpanel/jailshell并使用它运行cronjobs的经验,但我已经尽力回答了这个问题

从您列出的输出中可以看出一种模式,即进程的开始时间显然是4组,这使我认为每4组都是您的cleaner运行的一个实例。父进程可能是分叉子进程。您可以使用“ps-ef”命令来验证这个理论,从而获得父进程

如果这个理论是正确的,那么你可以使用

exec("ps auxwww | grep cleaner.php | grep -v grep | grep -v jailshell”, $output);
它会回来的,只是回来而已

php /home/user1/public_html/crons/cleaner.php
如果对$ouput使用计数,则该值应给出实际运行的进程数

在实现方面,您可以在数据库中使用一个表,该表存储一个值,该值包含当前正在运行的清理器数量,并在cron停止和启动时递增和递减该值。您还需要使用某种形式的事务来执行此操作,以便表的更新是原子的

然而,cron每分钟运行一次,持续5分钟,这一事实让我认为您可能需要考虑使cleaner.php更高效,这样您就不需要运行5个实例。这意味着您可以消除一次只运行5个cleaner实例的问题

根据我对您最初问题的评论,似乎cpanel/jailshell复制了cron,因为您得到了两者的结果

crontab-u root-l和crontab-u user1-l

因此,我要确保cron first只执行一次,而不是由root和user1用户执行

简短回答:

在WHM中的“调整设置”->“系统”下,选项标题为:“监禁/过程安装方法”。如果将其设置为“始终装载完整/proc”,这将允许CRON启动的脚本通过ps和top查看所有进程。如果您保持监狱地狱启用,您仍然必须忽略它们(即grep-v jailshell),但计数将再次准确

说明和历史:

这个问题困扰了我好几年了!我有许多脚本,跨越我的几个站点,CRON每分钟运行一次,但是这些脚本只计算实例数,以保持自身的一个副本运行。它们中的一些可以计算并允许特定数量的实例

然而,几年前,在2013年某个时候cPanel更新之后,所有这些都停止了工作。当时我不知道发生了什么,但我注意到我的脚本现在有多个实例,在“监狱”PID下运行。所以,我修改了我的脚本来计算这些。没用。我把它改为忽略监狱地狱副本“grep-v监狱地狱”,但这并没有完全起作用。我的脚本永远不会运行。他们会说有太多的例子。因此,我增加了计数以进行补偿,并让它们运行,但随着时间的推移,多个副本的产生将远远超过我施加的限制。几天之内,将有数百个实例,服务器将停止运行

今晚,我终于找到了解决办法

我发现了这个cPanel线程:

这听起来像是我的问题。cPanel说这不是问题,因为他们无法从命令行复制它,但他们不是从CRON创建的shell进行测试。这就是问题所在。当CRON运行时,它只能看到在其shell中启动的进程;不是该用户的所有进程

所以,再深入一点,我发现有人提到cPanel使监狱地狱也能以有限的能力挂载/proc。但是,他们在某一点上添加了覆盖。它可以在WHM的“调整设置”->“系统”下找到,标题为:“监禁/程序安装方法”。如果将其设置为“始终装载完整/proc”,这将允许CRON启动的脚本通过ps和top查看所有进程。如果您保持监狱地狱启用,您仍然必须忽略它们(即grep-v jailshell),但计数将再次准确。万岁

今晚我对它进行了全面的测试,我的脚本再次运行,但并没有失控


注意:这确实存在安全责任,因为共享主机用户(或此服务器上的受损站点)可能会使用从ps和top派生的信息逃离监狱外壳。所以要小心使用。我愿意冒这个风险,因为我会不断更新我的网站,编写自己的代码,并且不能在其他方面使用服务器。但是,您的情况可能需要更加小心。

您可以使用crontab-u root-l和crontab-u user1-l列出调用cleaner.php的行的crontab内容吗。您还可以提供一些关于您正在运行的linux版本的信息。两者的输出都是
数组([0]=>SHELL=“/usr/local/cpanel/bin/jailshell”[1]=>***php/home/user1/public\u html/crons/cleaner.php>/dev/null 2>&1)
这是一个