Soluzione 1:
GNU Killall può terminare i processi più vecchi di una data età, usando il loro nome di processo.
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
Soluzione 2:
Grazie alla risposta di Christopher sono stato in grado di adattarlo a quanto segue:
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 il comando find che mi mancava.
Soluzione 3:
find non funziona sempre, non tutti i sistemi hanno etimes disponibili e potrebbe essere il mio stato regex newb, ma non penso che tu abbia bisogno di qualcosa di più di questo:
ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
- elenca tutti i processi e fornisci le colonne PID,ELAPSED(etimes =seconds), COMMAND, USER, TT (grazie @ahoffman)
- con awk stampa il PID dove la 4a colonna ($4, USER) contiene il testo 'builder', e la 5a colonna ($5, TT) contiene il testo 'pts' e la colonna ELAPSED ha un valore maggiore di 600 sec (grazie @ amtd)
puoi quindi convogliarlo per uccidere o qualunque sia la tua necessità.
Soluzione 4:
# get elapsed time in seconds, filter our only those who >= 3600 sec
ps axh -O etimes | awk '{if ($2 >= 3600) print $2}'
Se vuoi puoi nutrire ps
con l'elenco dei PID da cercare all'interno, ad es. g.:
ps h -O etimes 1 2 3
Soluzione 5:
Penso che tu possa modificare alcune di quelle risposte precedenti per adattarle alle tue esigenze. Vale a dire:
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
Oppure
ps -eo pid,etime,comm | awk '$2!~/^..:..$/ && $3~/page\.py/ { print $1}' | kill -9
Penso che la seconda possa adattarsi meglio alle tue esigenze. La versione find finirebbe per bombardare altri processi di quell'utente
--Christopher Karel