cron, 분당 RAM 문제

cron, 분당 RAM 문제

wordpress cron.php 파일에서 PHP를 실행하는 cronjob이 있습니다. 이는 주로 릴리스 일정을 잡는 데 사용되며 캐시를 플러시할 수도 있다고 생각합니다.

매분마다 cron 작업을 실행합니다. 나는 정기적으로 ps를 확인했고 cron.php를 실행하는 두 개의 PHP 인스턴스를 보았습니다. 이제 인스턴스를 실행하면 필요한 모든 작업이 수행되므로 이는 필요하지 않습니다. 메모리를 확인하는 또 다른 작업이 있는데 때로는 메모리 충돌을 일으키는 두 가지 인스턴스가 있습니다(항상 사용 가능한 메모리를 많이 갖고 싶고 메모리를 낮출 수는 있지만 그렇게 하고 싶지는 않습니다). 나는 작업이 1분 이상 걸릴 것이라고는 거의 믿지 않습니다(가능하더라도).

프로세스가 이미 존재하는 경우 작업을 어떻게 실행할 수 있나요? 데이터베이스에 연결/사용하지 않으면 PHP 코드 자체를 검사할 수 없다고 생각합니까? 사용할 수 있는 cron 명령이 있습니까? 1분 이상 인스턴스를 종료하고 싶지 않습니다. 새로운 것을 생성하지 마십시오.

답변1

이것은 간단한 bash 스크립트 솔루션입니다. cron.php 스크립트에서도 동일한 작업을 수행할 수 있습니다. 실제로 너무 오랫동안 실행된 프로세스를 확인합니다. 이는 자동화된 시스템에 좋은 아이디어일 수 있습니다.

#!/bin/bash

# Exit if process is already running
if test -e /tmp/wordpress-job.pid; then
  # Check if the pid that was stored in /tmp/wordpress-job.pid does exist
  if ps ax -o pid= | grep $(cat /tmp/wordpress-job.pid ) &> /dev/null; then
    exit 0
  fi
fi

# Create the file that marks this process as running
echo $$ > /tmp/wordpress-job.pid

# Some extra security check to prevent the pid file
# to survive.
trap "rm -f /tmp/wordpress-job.pid" EXIT TERM INT HUP 

# Start the long-running process in the background
sleep 3600 & # long-running process

# Sleep some time before trying to kill that process
sleep 300

# Kill job if it takes longer than it should
kill %1

# Delete the file that marks this process as running
rm -f /tmp/wordpress-job.pid

"sleep 3600"을 php 명령줄로 바꾸고 아래의 300을 스크립트 실행이 허용되는 최대 시간으로 변경해야 합니다.

답변2

crontab 항목을 실행하십시오.

if mv /var/run/my-php-job.pending /var/run/my-php-job.running 2>/dev/null; then
  echo $$ >|/var/run/my-php-job.running   # optional
  … # run the job
  : >|/var/run/my-php-job.running         # optional
  mv /var/run/my-php-job.running /var/run/my-php-job.pending
fi

이것을 @rebootcrontab 항목에 넣으세요:

rm -f /var/run/my-php-job.running
touch /var/run/my-php-job.pending

파일 이름은 잠금 역할을 합니다. 그 동안에는 .running작업이 실행 중이고 다음 작업이 시작되지 않습니다. 이면 .pending실행 중인 작업이 시작되고 로 전환됩니다 .running.

.running선택적 행이 포함된 경우 작업이 중단된 경우 조사를 위해 셸의 프로세스 ID가 파일에 기록됩니다 . 로그 파일은 이를 중복하게 만듭니다.

작업이 실행 중인 셸이 충돌하는 경우(누군가 고의로 작업을 종료하거나 메모리가 부족할 경우에만 발생함) 잠금 파일이 중단됩니다 .running(작업 자체가 충돌하면 의문의 여지가 없습니다.) 이전 스크립트의 갑작스러운 종료를 감지할 수 있지만 훨씬 어렵습니다.

답변3

병렬 실행을 피하기 위한 특별한 유틸리티가 있습니다: util-linux의 Flock, BSD 시스템의 lockf, NetBSD의 shlock, INN 및 cnews 패키지.

가장 가능성이 높은 사례(Linux)의 경우 호출은 다음과 같습니다.

flock -w 60 /somedir/lockfile cron.php

다른 답변의 조리법은 기본 무리를 대체하며 그러한 도구가 없는 경우에만 유용합니다.

OTOH, 프로그램에서 이러한 잠금을 직접 처리할 수 있지만 모든 세부 사항을 반복하도록 주의해야 합니다. 그렇지 않으면 경쟁 조건이 발생할 수 있습니다.

관련 정보