crontab, 인스턴스, 메모리 문제+스팸

crontab, 인스턴스, 메모리 문제+스팸

내 웹 사이트를 업데이트하기 위해 매분 php5 wp-cron.php를 실행하는 cronjob이 있습니다.

그런데 무슨 일이 일어났고 그 인스턴스가 30개 이상 있었습니다(이 덤프에는 31개가 표시되어 있습니다 ps aux). 램을 잡아먹고, 메모리 부족으로 추가 인스턴스가 종료되고, 상자에 SSH로 접속할 수 없게 되었습니다.

인스턴스가 왜 30분 이상 지속되는지 이해할 수 없습니다. 일반적으로 몇 초 정도 걸립니다. 그 일이 발생한 날에는 계획된 작업이 없었습니다(아마도 wp 캐시가 그것을 사용했을 수도 있지만 이전에는 문제가 없었습니다)

cronjob이 스팸을 보내 내 메모리를 파괴하는 것을 방지하려면 어떻게 해야 합니까? 인스턴스가 살아 있으면 시작하지 말라고 할 수 있는 방법이 있나요? 인스턴스가 5분 이상 살아 있으면 인스턴스를 종료하시겠습니까?

비슷한 일이 일어나지 않도록 보호할 수 있는 방법이 있나요?

답변1

내 생각에 당신이 가장 먼저 해야 할 일은 해당 작업의 31가지 인스턴스를 발생시킨 범인의 흥미를 끄는 것입니다. 일반적으로 프로그램이 어느 시점에서 중단될 수 있으므로 웹 사이트를 성공적으로 업데이트하지 않으려는 경우가 아니면 이 문제를 디버그하고 수정해야 합니다.

"인스턴스가 살아 있으면 시작하지 말라고 말할 수 있는 방법이 있습니까?" 예, 몇 가지 방법이 있습니다. 그 중 하나는 pgrep yourprogramname인스턴스가 이미 존재하는지 확인하는 것입니다. 그렇다면 호출하여 pkill -x yourprogramname인스턴스를 종료 할 수 있습니다. 모두.

답변2

여러 복사본이 실행되는 것을 방지하려면 Flock(Linux), lockf(FreeBSD), shlock(일부 시스템에서 제공, 안정성이 낮음)을 사용하십시오. 이는 실행 시간을 제한하지 않지만 하나의 프로세스만 실행되도록 보장합니다. 그런 다음 작동이 중단되면 즉시 상태를 분석할 수 있습니다.

ulimit 쉘 내장을 사용하여 생성된 프로세스의 CPU 시간을 제한할 수 있습니다.

벽 시간을 제한하려면 프로세스 종료를 기다리고 시간 초과 후 프로세스를 종료하는 스크립트를 작성할 수 있습니다. Python/Perl/etc에서는 더 쉽습니다. 그러나 쉘은 이것을 허용합니다(트랩 및/배경 하위 항목 사용).

때로는 cron처럼 호출을 시작하는 대신 호출 사이에 고정된 시간(예: 이전 호출 끝에서 다음 호출 시작까지)을 제공하는 것이 유용할 수 있습니다. 일반적인 종류의 크론에서는 이를 허용하지 않으므로 특수 스크립트를 실행해야 합니다.

관련 정보