Řešení 1:
GNU Killall může zabít procesy starší než daný věk pomocí jejich názvu procesu.
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
Řešení 2:
Díky Christopherově odpovědi jsem to dokázal přizpůsobit následujícímu:
find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill
-mmin
byl příkaz find, který jsem postrádal.
Řešení 3:
find nefunguje vždy, ne každý systém má k dispozici etimes a může to být můj regex newb status, ale nemyslím si, že potřebujete něco víc než toto:
ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
- uveďte všechny procesy a uveďte sloupce PID,ELAPSED(etimes =sekund), COMMAND, USER, TT (díky @ahoffman)
- pomocí awk vytiskněte PID, kde 4. sloupec ($4, USER) obsahuje text 'builder' a 5. sloupec ($5, TT) obsahuje text 'pts' a sloupec ELAPSED má hodnotu větší než 600 sekund (díky @ amtd)
pak to můžete zabíjet nebo cokoli potřebujete.
Řešení 4:
# get elapsed time in seconds, filter our only those who >= 3600 sec
ps axh -O etimes | awk '{if ($2 >= 3600) print $2}'
Pokud chcete, můžete nakrmit ps
se seznamem PID k vyhledání, např. např.:
ps h -O etimes 1 2 3
Řešení 5:
Myslím, že některé z těchto předchozích odpovědí můžete upravit tak, aby vyhovovaly vašim potřebám. Jmenovitě:
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
Nebo
ps -eo pid,etime,comm | awk '$2!~/^..:..$/ && $3~/page\.py/ { print $1}' | kill -9
Myslím, že to druhé může nejlépe vyhovovat vašim potřebám. Verze find by tímto uživatelem zničila další procesy
--Christopher Karel