CPU가 50 % 이상 유휴 상태 일 때 어떻게 cron 작업 (bash 스크립트)을 실행할 수 있습니까?머신이 유휴 상태 일 때만 크론 작업 실행
나는
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
내 현재 설정입니다 TOP
에서 CPU의 유휴를 얻을 수 있습니다 :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.
그리고 CPU 유휴 상태에 대한 PHP 스크립트 검사가 있습니다
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 인스턴스를, 그래서 내가 원하는 유휴 상태 일 때 처리 능력을 활용할 수 있습니다. 그러나 서버를 심하게로드하지 마십시오. (리던던시 DB 인스턴스, 개발 인스턴스, 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의 문제는 해결되지 않지만 지금은 충분합니다.
유휴 1 초 100 % 그 다음으로, 당신의 우선 순위를 설정하는 데 cronjob을 사용하는 법은 어떨까요? –
@Dagon 나는 더 나은 해결책이 없으므로 런타임시 점검은 적어도 아무것도하지 않는 것보다 낫습니다. 예 : 시스템이 이미 사용 중이면 작업을 시작합니다. – Reed
이것은 여기 또는 거기에 없지만 왜 당신은 PHP에서 cronjobs을 쓰고 있습니까 – Eevee