Lösung 1:
GNU Killall kann Prozesse, die älter als ein bestimmtes Alter sind, unter Verwendung ihres Prozessnamens beenden.
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
Lösung 2:
Dank Christophers Antwort konnte ich es wie folgt anpassen:
find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill
-mmin
war der Suchbefehl, den ich vermisst habe.
Lösung 3:
find funktioniert nicht immer, nicht jedes System hat etimes verfügbar, und es könnte mein regex newb status sein, aber ich glaube nicht, dass Sie mehr als das hier brauchen:
ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
- alle Prozesse auflisten und die Spalten PID, ELAPSED(etimes =Sekunden), COMMAND, USER, TT angeben (danke @ahoffman)
- mit awk die PID ausgeben, wobei die 4. Spalte ($4, USER) den Text 'builder' enthält und die 5. Spalte ($5, TT) den Text 'pts' enthält und die ELAPSED-Spalte einen Wert größer als 600 Sekunden hat (danke @ amtd)
Sie können das dann leiten, um zu töten oder was auch immer Sie brauchen.
Lösung 4:
# get elapsed time in seconds, filter our only those who >= 3600 sec
ps axh -O etimes | awk '{if ($2 >= 3600) print $2}'
Wenn Sie möchten, können Sie ps
füttern mit Liste von PIDs zum Nachschlagen, z. B.:
ps h -O etimes 1 2 3
Lösung 5:
Ich denke, Sie können einige dieser vorherigen Antworten an Ihre Bedürfnisse anpassen. Nämlich:
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
Oder
ps -eo pid,etime,comm | awk '$2!~/^..:..$/ && $3~/page\.py/ { print $1}' | kill -9
Ich denke, der zweite passt am besten zu Ihren Bedürfnissen. Die Find-Version würde andere Prozesse dieses Benutzers zerstören
--Christoph Karel