내 웹 사이트를 업데이트하기 위해 매분 php5 wp-cron.php를 실행하는 cronjob이 있습니다.
그러나 문제가 발생했고 이에 대한 인스턴스가 30개가 넘었습니다(이 덤프에는 31개로 표시됨 ps aux
). 그것은 내 메모리를 소모하고, 메모리 부족으로 인해 추가 do 인스턴스가 종료되도록 하며, 상자에 SSH를 연결하는 것을 방지합니다.
인스턴스 수명이 왜 30분을 초과하는지 이해할 수 없습니다. 인스턴스는 일반적으로 몇 초 정도 걸립니다. 나는 그 일이 일어난 날 어떤 작업도 계획하지 않았습니다. (물론 wp 캐시가 그것을 사용했을지도 모르지만, 이전에는 문제가 없었습니다)
cronjob이 스팸을 보내 메모리를 손상시키는 것을 방지하려면 어떻게 해야 합니까? 인스턴스가 아직 살아 있으면 인스턴스를 시작하지 않도록 할 수 있는 방법이 있나요? 인스턴스가 5분 이상 생존하면 종료되나요?
이런 일이 발생하지 않도록 자신을 보호할 수 있는 방법이 있나요?
답변1
내 생각에 당신이 가장 먼저 해야 할 일은 이 일을 일으킨 범인을 선동하는 것입니다. 일반적으로 이는 프로그램이 어느 시점에 중단되는 것일 수 있으므로 웹 사이트가 성공적으로 업데이트되는 것을 원하지 않는 한 이 문제를 디버그하고 수정해야 합니다.
"인스턴스가 살아 있으면 시작하지 말라고 말할 수 있습니까?"에는 여러 가지 방법이 있습니다. 그 중 하나는 pgrep yourprogramname
인스턴스가 이미 존재하는지 확인하고, 그렇다면 pkill -x yourprogramname
모두 종료를 호출할 수 있습니다.
답변2
대상의 여러 복사본이 실행되는 것을 방지하기 위해 Flock(Linux), lockf(FreeBSD) 및 shlock(신뢰성이 낮은 일부 시스템에서 제공)을 사용할 수 있습니다. 이는 실행 시간을 제한하지 않지만 하나의 프로세스만 실행되도록 보장합니다. 그런 다음 중단되면 해당 상태를 동적으로 분석할 수 있습니다.
ulimit 쉘 내장 명령을 사용하여 생성 프로세스의 CPU 시간을 제한할 수 있습니다.
정지 시간을 제한하려면 프로세스가 종료될 때까지 기다렸다가 시간 초과 후 프로세스를 종료하는 스크립트를 작성할 수 있습니다. Python/Perl/etc에서는 더 쉽습니다. 그러나 쉘에서는 이것도 허용합니다(트랩 및/또는 배경 하위 키 사용).
때로는 cron처럼 start를 호출하는 대신 호출 사이에 고정된 시간(즉, 이전 호출의 끝부터 다음 호출의 시작까지)을 제공하는 것이 유용할 수 있습니다. 일반 cron에서는 이를 허용하지 않으므로 특수 스크립트를 실행해야 합니다.