Command-Line

殺死我在過去一小時內啟動的所有程序?

  • November 5, 2021

如何使用我的使用者名殺死在(過去一小時,過去一天)等內啟動的所有程序?

  1. 查找不到一小時的程序
  2. 提取pid
  3. 殺死 pids

工藝清單:

$ ps -e -o pid,user,etimes,comm \
   | awk -v me=$USER '$2 == me && $3 <= 3600 { print }'

生產

661162 jaroslav    3006 chrome
667859 jaroslav    1711 chrome
669145 jaroslav    1471 chrome
671222 jaroslav    1016 chrome
675278 jaroslav     270 chrome
675578 jaroslav     207 sleep
676094 jaroslav      91 chrome
676102 jaroslav      91 chrome
676528 jaroslav      11 chrome
676529 jaroslav      11 chrome
676553 jaroslav      11 chrome
676602 jaroslav       3 top
676615 jaroslav       0 ps
676616 jaroslav       0 awk

提取pid:

$ ps -e -o pid,user,etimes,comm \
   | awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }'

殺死pid:

$ ps -e -o pid,user,etimes,comm \
   | awk -v me=$USER '$2 == me && $3 <= 3600 { print $1 }' \
   | xargs -rt kill

xargs 的 -tr 參數是可選的,如果沒有輸出,將跳過 xargs 並報告每個執行的行。

您甚至可以對其進行測試,kill -0它不會停止程序,但如果程序不再執行,則會報告錯誤。

$ ps -e -o pid,user,etimes,comm \
   | awk -v me=$USER '$2 == me  && $3 <= 3600 { print $1 }' \
   | xargs -rt kill -0 
kill -0 661162 667859 669145 671222 675278 676602 677310 677311 677883 677893 677965 677966 677967 677968
kill: (677966): No such process
kill: (677967): No such process

意識到這個管道/腳本可以在回饋後殺死自己,(注意上面程序列表中的 etimes=0),這是一個忽略最近程序的修訂版本:

ps -u "$LOGNAME" -o pid,etimes,comm \
 | awk '$2 <= 3600 && $2 > 1 { print $1 }' \
 | xargs -rt kill -0

這可能不是很便攜,但應該可以在 Linux 上執行(至少 ubuntu 18)。希望這能讓您對如何解決這個問題有所了解。

<mother-mode> 不要在沒有 awk 和 xargs 的情況下執行 ps 命令,並首先殺死以查看將被殺死的內容,如果以 root 身份執行,請小心。您可能會關閉系統或殺死最近重新啟動的一些重要服務。 </mother-mode>

引用自:https://unix.stackexchange.com/questions/676258