Primero, sí, he visto esta pregunta:
Encuentra (y elimina) procesos antiguos
Las respuestas allí son incorrectas y no funcionan. He votado y comentado en consecuencia.
Los procesos que quiero matar se ven así cuando se enumeran con ps aux | grep page.py:
apache 424 0.0 0.1 6996 4564? S 07:02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2686 0.0 0.1 7000 3460? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 2926 0.0 0.0 6996 1404? S Sep02 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 7398 0.0 0.0 6996 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 9423 0.0 0.1 6996 3824? S Sep10 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 11022 0.0 0.0 7004 1400? S Sep01 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15343 0.0 0.1 7004 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15364 0.0 0.1 7004 3792? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 15397 0.0 0.1 6996 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 16817 0.0 0.1 7000 3788? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 17590 0.0 0.0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 24448 0.0 0.0 7000 1432? S Sep07 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py apache 30361 0.0 0.1 6996 3776? S Sep09 0:00 /usr/bin/python2.6 /u/apps/pysnpp/current/bin/page.py
Estoy buscando configurar un cron diario simple que encuentre y elimine los page.pyprocesos anteriores a una hora.
La respuesta aceptada en la pregunta antes mencionada no funciona, ya que no coincide con un rango de veces, simplemente coincide con los procesos que se han estado ejecutando de 7 días a 7 días 23 horas 59 minutos y 59 segundos. No quiero matar los procesos que se han estado ejecutando de 1 a 2 horas, sino más de 1 hora.
La otra respuesta a la pregunta anterior usando findno funciona, al menos no en Gentoo o CentOS 5.4, o escupe una advertencia o no devuelve nada si se sigue el consejo de dicha advertencia.

Gracias a la respuesta de Christopher pude adaptarlo a lo siguiente:
-mminfue el comando de encontrar que me faltaba.fuente
find /proc -maxdepth 1 -type d -name 1 -mmin +60 -ls- / sbin / init no aparece en la lista a pesar del tiempo de actividad de días, no de horas. Parece que no puede confiar en el tiempo de modificación de directorios de / proc /.find no siempre funciona, no todos los sistemas tienen ediciones disponibles, y podría ser mi estado regex newb, pero no creo que necesite nada más que esto:
entonces puedes canalizar eso para matar o lo que sea que necesites.
fuente
ps, pero doblaría los múltiplesgreps en el únicoawk, y por seguridad restringiría las coincidencias de patrones a columnas particulares (para descartar, por ejemplo, una coincidencia de nombre de comando constructor, etc.)Si lo desea, puede alimentar
pscon una lista de PID para buscar, por ejemplo:fuente
etimesfunciona solo para nuevospsCreo que puede modificar algunas de esas respuestas anteriores para satisfacer sus necesidades. A saber:
O
ps -eo pid, etime, comm | awk '$ 2! ~ /^..:..$/ && $ 3 ~ / page \ .py / {print $ 1}' | matar -9Creo que el segundo puede ajustarse mejor a tus necesidades. La versión de búsqueda terminaría destruyendo otros procesos de ese usuario:
Christopher Karel
fuente
kill -9excepto como último recurso. Use-SIGINTo-SIGTERM.psgenerará tiempo en^..:..$formato cuando sea menos de una hora.fuente
psmiscutilidad? El OP mencionó CentOS; ¿Está disponible como RPM?El problema
Convertir la
etimecolumna depscomando (tiempo transcurrido) a segundos. La especificación de tiempo está en este formato[[dd-]hh:]mm:ss. Las versiones más nuevas depstienen unaetimescolumna que generaetimevalor en segundos.La solución: función awk personalizada simple
Esta función awk personalizada admite todos los formatos de
etimecolumna (p03-12:30:59. Ej. ,00:07Etc.). Simplemente péguelo en su script awk, es una solución amigable.sec(T)convierte T a segundosTespecificación de tiempo en[[dd-]hh:]mm:ssformato (petime. ej. )Crecuento de campos enT(equivalente a la variable NF de awk)Amatriz de campos enT(equivalente a la variable $ de awk)A[C>3?C-3:99]Esta es una forma segura de hacer referencia al cuarto valor (es decir, número de días) en orden inverso. Este enfoque es útil porque los días y las horas son opcionales. Si la matriz no es lo suficientemente larga, desreferenciaráA[99]lo que arrojará0valor. Supongo que99es lo suficientemente alto para la mayoría de los casos de uso.Ejemplo del mundo real
Este bash oneliner matará el
soffice.binproceso que se ejecuta bajo el usuario actual si el proceso es anterior a 180 segundos.fuente
El
lstartcampo enpsda un formato de tiempo consistente que podemos alimentardatepara convertir a segundos desde la época. Luego solo comparamos eso con la hora actual.fuente
Modifiqué la respuesta que te dieron en la publicación anterior
La expresión regular busca 2 tipos de segundo argumento:
Hours:minutes:secondsexpresión.Eso debería coincidir con todo, excepto los procesos jóvenes que tendrían la forma
minutes:seconds.fuente
Esto probablemente sea excesivo, pero tuve la curiosidad de terminarlo y probar que funciona (en un nombre de proceso diferente en mi sistema, por supuesto). Puede eliminar la captura
$usery$pidsimplificar la expresión regular, que solo agregué para la depuración, y no tenía ganas de volver a salir. Las capturas con nombre de perl 5.10 eliminarían un par de líneas más, pero esto debería funcionar en perls más antiguos.Necesitará reemplazar la impresión con un kill, por supuesto, pero no estaba dispuesto a matar nada en mi propio sistema.
fuente
Tengo un servidor con fechas incorrectas en / proc y find no funciona, así que escribí este script:
fuente
Versión de Python usando el ctime de las entradas de proceso en
/proc:fuente
Utilizo este script simple, toma dos argumentos: nombre del proceso y antigüedad en segundos.
fuente
Esto debería funcionar
killall --older-than 1h $proc_namefuente
--older-thany es fácil pasarla por alto. En comparación con las otras respuestas, esto es mucho más fácil, y ahora está disponible también en EL7.No estaba satisfecho con la otra solución, la mayoría de ellos son demasiado crípticos (mi conocimiento básico es un poco limitado) y, por lo tanto, no puedo personalizarlos ...
He creado mi propia solución. Probablemente no sea la mejor, pero funciona y es legible
Puede guardar este script en un archivo y hacerlo ejecutable (eventualmente llamarlo con el uso de cron)
fuente
72 = 3 días 48 = 2 días 24 = 1 día
funciona :)
fuente