Básicamente, necesito poder escanear el árbol de procesos y encontrar procesos que coincidan con un nombre determinado y comencé a correr más de una semana. Una vez que los tengo, necesito matarlos. Todos los procesos todavía son vistos como en estado de ejecución por el sistema, simplemente sin usar ningún tiempo del sistema. Por lo general, también se sentarán para siempre en este estado.
Idealmente me gustaría algo similar para encontrar, pero para procesos.
El sistema es Debian Linux y esto será programado y ejecutado por cron, así que no tengo problemas reales con algo grande pero comprensible.
Respuestas:
Puedes hacer esto con una combinación de ps, awk y kill:
Le da una salida de tres columnas, con el PID del proceso, el tiempo transcurrido desde que comenzó el proceso y el nombre del comando, sin argumentos. El tiempo transcurrido se parece a uno de estos:
Dado que desea procesos que se hayan estado ejecutando durante más de una semana, debería buscar líneas que coincidan con ese tercer patrón. Puede usar awk para filtrar los procesos por tiempo de ejecución y por nombre de comando, así:
que imprimirá los pids de todos los comandos que coinciden con 'mycommand' que se han estado ejecutando durante más de 7 días. Canaliza esa lista en kill, y listo:
fuente
etimes
es más útil - serverfault.com/a/393476/67675killall --quiet --older-than 1w process_name
fuente
Se puede obtener toda la información que necesita
ps -ef
. Ver la columna "TIEMPO". Combina eso congrep
para ordenar los procesos que necesitas. En ese punto, puede utilizarcut
para tomar el pid de todos los procesos de coincidencia y pasarlos akill
.Avíseme si desea obtener más detalles sobre cómo hacer esto.
fuente
si eres root, para deshacerte de la basura (/ proc / fs proc / stat ...)
fuente
Cuando se inicia un proceso, crea un directorio en el sistema de archivos / proc. Puede usar el comando find para obtener directorios de más de 7 días y eliminar los procesos de la siguiente manera:
fuente
find: warning: you have specified the -maxdepth option after a non-option argument -user, but options are not positional (-maxdepth affects tests specified before it as well as those specified after it). Please specify options before other arguments.
mover -maxdepth para que sea la primera salida, no devuelve ningún proceso, y estoy seguro de que muchos deberían coincidir.Nadie mencionó ps-watcher aquí. Creo que podría comparar $ start_time usando la función elapsed2sec, pero no estoy completamente seguro. Aquí está mi primer pensamiento:
No tengo idea si eso funciona, pero debería ser un buen punto de partida.
fuente