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.py
procesos 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 find
no 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:
-mmin
fue 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últiplesgrep
s 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
ps
con una lista de PID para buscar, por ejemplo:fuente
etimes
funciona solo para nuevosps
Creo que puede modificar algunas de esas respuestas anteriores para satisfacer sus necesidades. A saber:
O
Creo 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 -9
excepto como último recurso. Use-SIGINT
o-SIGTERM
.ps
generará tiempo en^..:..$
formato cuando sea menos de una hora.fuente
psmisc
utilidad? El OP mencionó CentOS; ¿Está disponible como RPM?El problema
Convertir la
etime
columna deps
comando (tiempo transcurrido) a segundos. La especificación de tiempo está en este formato[[dd-]hh:]mm:ss
. Las versiones más nuevas deps
tienen unaetimes
columna que generaetime
valor en segundos.La solución: función awk personalizada simple
Esta función awk personalizada admite todos los formatos de
etime
columna (p03-12:30:59
. Ej. ,00:07
Etc.). Simplemente péguelo en su script awk, es una solución amigable.sec(T)
convierte T a segundosT
especificación de tiempo en[[dd-]hh:]mm:ss
formato (petime
. ej. )C
recuento de campos enT
(equivalente a la variable NF de awk)A
matriz 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á0
valor. Supongo que99
es lo suficientemente alto para la mayoría de los casos de uso.Ejemplo del mundo real
Este bash oneliner matará el
soffice.bin
proceso que se ejecuta bajo el usuario actual si el proceso es anterior a 180 segundos.fuente
El
lstart
campo enps
da un formato de tiempo consistente que podemos alimentardate
para 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:seconds
expresió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
$user
y$pid
simplificar 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_name
fuente
--older-than
y 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