Solución 1:
GNU Killall puede matar procesos anteriores a una edad dada, utilizando su nombre de proceso.
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
Solución 2:
Gracias a la respuesta de Christopher pude adaptarlo a lo siguiente:
find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill
-mmin
era el comando de búsqueda que me faltaba.
Solución 3:
find no siempre funciona, no todos los sistemas tienen etimes disponibles, y podría ser mi estado de regex newb, pero no creo que necesites nada más que esto:
ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
- enumere todos los procesos y proporcione las columnas PID, ELAPSED(etimes =segundos), COMMAND, USER, TT (gracias @ahoffman)
- con awk imprima el PID donde la cuarta columna ($4, USUARIO) contiene el texto 'constructor', y la quinta columna ($5, TT) contiene el texto 'pts' y la columna TRANSCURRIDO tiene un valor mayor a 600 segundos (gracias @ amd)
luego puedes canalizar eso para matar o lo que sea que necesites.
Solución 4:
# get elapsed time in seconds, filter our only those who >= 3600 sec
ps axh -O etimes | awk '{if ($2 >= 3600) print $2}'
Si quieres puedes alimentar a ps
con una lista de PID para buscar dentro, por ej. ej.:
ps h -O etimes 1 2 3
Solución 5:
Creo que puede modificar algunas de esas respuestas anteriores para satisfacer sus necesidades. A saber:
for FILE in (find . -maxdepth 1 -user processuser -type d -mmin +60) do kill -9 $(basename $FILE) # I can never get basename to work with find's exec. Let me know if you know how! done
O
ps -eo pid,etime,comm | awk '$2!~/^..:..$/ && $3~/page\.py/ { print $1}' | kill -9
Creo que la segunda puede ajustarse mejor a tus necesidades. La versión de búsqueda terminaría destruyendo otros procesos por parte de ese usuario
--Christopher Karel