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