解決策 1:
GNU Killall は、プロセス名を使用して、特定の経過時間よりも古いプロセスを強制終了できます。
if [[ "$(uname)" = "Linux" ]];then killall --older-than 1h page.py;fi
解決策 2:
クリストファーの答えのおかげで、私はそれを次のように適応させることができました:
find /proc -maxdepth 1 -user apache -type d -mmin +60 -exec basename {} \; \
| xargs ps | grep page.py | awk '{ print $1 }' | sudo xargs kill
-mmin
見落としていた検索コマンドでした。
解決策 3:
find は常に機能するとは限りません。すべてのシステムで etimes が利用できるわけではありません。これは私の正規表現 newb ステータスによるものかもしれませんが、これ以上のものは必要ないと思います:
ps -eo pid,etimes,comm,user,tty | awk '{if ($4 ~ /builder/ && $5 ~ /pts/ && $2>600) print $1}'
- すべてのプロセスを一覧表示し、列 PID、ELAPSED(etimes =秒)、COMMAND、USER、TT を提供します (thanks @ahoffman)
- awk を使用して、4 列目 ($4、USER) にテキスト「builder」が含まれ、5 列目 ($5、TT) にテキスト 'pts' が含まれ、ELAPSED 列の値が 600 秒よりも大きい PID を出力します (thanks @アムト)
その後、それを kill にパイプするか、必要に応じてパイプすることができます。
解決策 4:
# get elapsed time in seconds, filter our only those who >= 3600 sec
ps axh -O etimes | awk '{if ($2 >= 3600) print $2}'
必要に応じて ps
をフィードできます 検索する PID のリストを含む、e.例:
ps h -O etimes 1 2 3
解決策 5:
これらの以前の回答の一部をニーズに合わせて変更できると思います。つまり:
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
または
ps -eo pid,etime,comm | awk '$2!~/^..:..$/ && $3~/page\.py/ { print $1}' | kill -9
2番目があなたのニーズに最も合っていると思います。 find バージョンは、そのユーザーによって他のプロセスを無効にすることになります
--クリストファー・カレル