Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/298.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 仅在机器空闲时运行cron作业(linux)_Php_Linux_Bash_Cron_Centos - Fatal编程技术网

Php 仅在机器空闲时运行cron作业(linux)

Php 仅在机器空闲时运行cron作业(linux),php,linux,bash,cron,centos,Php,Linux,Bash,Cron,Centos,如何仅在CPU空闲>50%时运行cron作业(bash脚本) 我可以从顶部获得cpu空闲 top -b -d 00.10 -n 3 |grep ^Cpu Cpu(s): 0.3%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st 我当前的设置是: crontab 0,15,30,45 * * * * /usr/bin/php /home/user/batchprocess.php # I could use a bash sc

如何仅在CPU空闲>50%时运行cron作业(bash脚本)

我可以从顶部获得cpu空闲

top -b -d 00.10 -n 3 |grep ^Cpu
Cpu(s): 0.3%us, 0.3%sy, 0.0%ni, 99.3%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
我当前的设置是:

crontab
0,15,30,45 * * * * /usr/bin/php /home/user/batchprocess.php
# I could use a bash script here to call PHP, if it is a good solution.
crontab
0,15,30,45 * * * * nice -20 /usr/bin/php /home/user/batchprocess.php
我让PHP脚本检查CPU空闲:

batchprocess.php
proc_nice(10);
// wait for CPU idle
do{
    $cpu_stat = exec('top -b -d 00.10 -n 3 |grep ^Cpu');    
    $tmp = stristr($cpu_stat,'%id',TRUE);
    $cpuidle = trim(substr($tmp,strrpos($tmp,',')+1));
}while($cpuidle<$min_cpuidle);
// do actual processing here
和PHP脚本:

batchprocess.php
if ($cpuidle < 50) 
    exit(0);
// do actual processing here
batchprocess.php
如果($cpuidle<50)
出口(0);
//在这里进行实际处理
我会测试一下,然后把我的发现发回去


反馈:我已经通过DEV/PRD发布了这段代码,它运行得非常好。它不能解决TOCTOU的问题,但目前已经足够好了。

这是一个典型的情况,即检查系统是否空闲,然后启动流程,但是在检查之后,或者在流程启动之前,其他一些事情导致系统中的另一个流程启动,并且您仍然加载了超出需要的系统

执行此操作的“正确”方法是使用
nice
命令为进程赋予低优先级。顺便说一下,检查cpu使用情况的循环将使用100%的cpu,因此除非第一次检查它是否空闲,否则它可能无法工作

您已经有了一个“proc_nice(10)”,因此应该可以完成这项工作。我看不出花费精力来确定系统是否繁忙有任何意义

如果您希望在代码中的适当位置执行以下操作:

 if (check_cpu_usage() > 50%) sleep(1second); 

但我不确定这是否有多大用处——如果系统很忙,一个“好”的进程将不会收到太多的CPU时间,因此不会与其他以更高优先级运行的进程竞争

如果您只是希望在系统负载为2.0或更低时执行脚本,您可以使用如下shell脚本:

#!/bin/sh
LOAD=`cat /proc/loadavg | cut -d" " -f1`
THRESHOLD=2.0
if [ $(bc <<< "$LOAD <= $THRESHOLD") -eq 1 ]; then
    $@
fi
#/垃圾箱/垃圾箱
载荷=`cat/proc/loadavg | cut-d”“-f1`
阈值=2.0

如果[$(bc空闲一秒100%下一秒,使用nice on you cronjob设置其priority@Dagon因为我没有更好的解决方案,所以运行时检查至少比什么都不做要好。例如,在系统已经忙的时候启动作业。这既不在这里也不在那里,但天哪,为什么要在中编写cronjobsphp@Eevee批处理作业使用amazon AWSdk、mySQL和imagick。所以PHP是我工作的方式。不幸的是,我不知道任何ruby/perl/python。感谢您提供的扩展信息。我没有考虑这个过程在实践中有多“好”。高优先级的过程会让它长时间停止吗?例如,运行完整的DB备份。如果您让它“非常好”(
nice-n20
在命令行上)如果有其他东西需要运行,那么它肯定会使用很少的CPU。我过去经常这样做,因为我喜欢做一些计算[这花费了很多很多小时]。编译Linux内核时的差异并不明显,但编译完成后,计算将再次启动并完成其工作。从理论上讲,cron和低优先级作业的组合可能会导致该作业同时运行的多个低运行实例。这仍然是个问题“系统现在在做什么",它可能会在下一个时钟周期内发生变化。是的,但是这种方法也有有效的用例。想象一下,在这种情况下,cron作业需要为共享资源持有一个锁。在这种情况下,使用
nice-20
运行作业会带来将共享资源锁定任意时间的风险。这对于我正在运行一批CPU密集型计算,并希望在第一批计算完成时推迟启动下一批计算,而不知道何时会发生,也不访问正在运行的终端。