簡體   English   中英

僅在機器空閑時運行cron作業(linux)

[英]run cron job only when machine is idle (linux)

如何在CPU空閑> 50%時運行cron作業(bash腳本)?

我可以從TOP獲得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.

我有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

我當前的方法的問題是無論CPU利用率如何都啟動程序。 運行TOP的while循環感覺效率不高。 我希望它只在CPU空閑> 50時啟動

一些額外的信息:

  • Centos 6.2,PHP5.3

  • 我有一些永不關閉的EC2實例,所以我想在閑置時利用它們的處理能力。 但永遠不要大量加載服務器。 (冗余數據庫實例,開發實例,NAT實例)

  • 我知道EC2自動縮放,現場實例。 只是想使用額外的容量。

  • 后台作業是圖像壓縮(CPU密集型,I / O或網絡不多)。

任何建議都是受歡迎的。 提前致謝!


根據下面的輸入,我意識到“好”是我個案中更好的解決方案。 我應該重新調整我的目標,以盡量減少對服務器的影響,而不是跟蹤CPU利用率。

所以新的設置是:

crontab
0,15,30,45 * * * * nice -20 /usr/bin/php /home/user/batchprocess.php

和PHP腳本:

batchprocess.php
if ($cpuidle < 50) 
    exit(0);
// do actual processing here

我會測試它並回復我的發現。


報告回來:我把這段代碼放到DEV / PRD上,效果很好。 它沒有解決TOCTOU的問題,但現在已經足夠好了。

這是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

將其保存為例如/usr/local/bin/if-idle ,並在crontab文件中的命令前面保留if-idle

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM