cron, 매분 램 문제

cron, 매분 램 문제

wordpress cron.php 파일에서 PHP를 실행하는 cronjob이 있습니다. 주로 게시물을 예약하는 데 사용되며 캐시를 새로 고칠 수도 있다고 생각합니다.

매분마다 cron 작업을 실행합니다. ps를 자주 확인했는데 cron.php를 실행하는 두 개의 PHP 인스턴스가 표시됩니다. 이제 하나의 인스턴스를 실행하면 필요한 모든 작업이 수행되므로 이는 필요하지 않습니다. RAM을 확인하는 또 다른 작업이 있는데 때로는 두 개의 인스턴스가 작동을 중단합니다(항상 사용 가능한 RAM의 양이 많을 것으로 예상하지만 낮출 수는 있지만 원하지 않습니다). 나는 한 작업이 1분 이상 걸릴 수 있다는 것을 거의 믿지 않습니다(물론 그럴 수도 있지만).

프로세스가 이미 존재하는 경우 작업을 실행하지 않으려면 어떻게 해야 합니까? DB를 연결/사용하지 않으면 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에서는 프로그램에서 이러한 잠금을 직접 처리할 수 있지만 모든 세부 사항을 주의 깊게 반복해야 합니다. 그렇지 않으면 경쟁 조건이 발생할 수 있습니다.

관련 정보