crontab, instancia, problemas de memoria+spam

crontab, instancia, problemas de memoria+spam

Tengo un cronjob que ejecuta php5 wp-cron.php cada minuto para actualizar mi sitio web.

Sin embargo, algo sucedió y tuve más de 30 instancias (31 está marcada en este volcado de ps aux). Consumió mi RAM, provocó que una instancia adicional terminara por falta de memoria y provocó que no pudiera ingresar a la caja mediante ssh.

No puedo entender por qué las instancias duraban más de 30 minutos, una suele tardar unos segundos. El día que sucedió no tenía ningún trabajo planeado (aunque tal vez lo usé wp cache, pero nunca antes tuve un problema)

¿Qué puedo hacer para evitar que un cronjob envíe spam y destruya mi memoria? ¿Hay alguna manera de decir que no se inicie si una instancia está activa? y si una instancia está viva durante más de 5 minutos, ¿matarla?

¿Hay alguna manera de protegerme para que no suceda algo similar?

Respuesta1

Creo que lo primero que debes hacer es intrigar al culpable que podría haber causado 31 casos de ese trabajo. Por lo general, su programa podría estar bloqueado en algún momento; debe depurar y solucionar este problema a menos que no desee que su sitio web se actualice correctamente.

Para "¿Hay alguna manera de decir que no inicie si una instancia está activa?", sí, hay un par de formas, una de ellas es simplemente verificar pgrep yourprogramnamesi ya existe una instancia; en caso afirmativo, puede llamar pkill -x yourprogramnamepara eliminarla. todo.

Respuesta2

Para evitar que se ejecuten varias copias, utilice Flock (Linux), lockf (FreeBSD), shlock (proporcionado con algunos sistemas, menos confiable). Esto no limitará el tiempo de ejecución, pero garantiza que solo se esté ejecutando un proceso. Luego, si se cuelga, podrás analizar su estado sobre la marcha.

Puede limitar el tiempo de CPU del proceso generado utilizando el shell ulimit integrado.

Para limitar el tiempo del muro, puede escribir un script que espere a que finalice el proceso y lo finalice después del tiempo de espera. Es más fácil en Python/Perl/etc. pero Shell también permite esto (usando trampa y/en niños en segundo plano).

A veces es útil proporcionar un tiempo fijo entre invocaciones (es decir, desde el final de la anterior hasta el inicio de la siguiente) en lugar de los inicios de las invocaciones, como lo hace cron. Los tipos habituales de cron no permiten esto; debe ejecutar un script especial.

información relacionada