Solution 1 :
GNU Killall peut tuer des processus plus anciens qu'un âge donné, en utilisant leur nom de processus.
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
Solution 2 :
Grâce à la réponse de Christopher, j'ai pu l'adapter à ce qui suit :
find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill
-mmin
était la commande de recherche qui me manquait.
Solution 3 :
find ne fonctionne pas toujours, tous les systèmes n'ont pas d'etimes disponibles, et c'est peut-être mon statut de regex newb, mais je ne pense pas que vous ayez besoin de quelque chose de plus :
ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
- liste tous les processus et fournit les colonnes PID,ELAPSED(etimes =seconds), COMMAND, USER, TT (merci @ahoffman)
- avec awk imprimer le PID où la 4ème colonne ($4, USER) contient le texte 'builder', et la 5ème colonne ($5, TT) contient le texte 'pts' et la colonne ELAPSED a une valeur supérieure à 600 sec (merci @ amtd)
vous pouvez ensuite le canaliser pour tuer ou quel que soit votre besoin.
Solution 4 :
# get elapsed time in seconds, filter our only those who >= 3600 sec
ps axh -O etimes | awk '{if ($2 >= 3600) print $2}'
Si vous voulez, vous pouvez nourrir ps
avec la liste des PID à rechercher, par ex. ex. :
ps h -O etimes 1 2 3
Solution 5 :
Je pense que vous pouvez modifier certaines de ces réponses précédentes pour répondre à vos besoins. A savoir :
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
Ou
ps -eo pid,etime,comm | awk '$2!~/^..:..$/ && $3~/page\.py/ { print $1}' | kill -9
Je pense que la seconde peut mieux répondre à vos besoins. La version de recherche finirait par détruire d'autres processus par cet utilisateur
--Christophe Karel