
我的系統中有一個老用戶(bob)。根據“top”的輸出,似乎該用戶運行了許多進程(其中大多數進程的命令是“java”)。由於我具有 root 訪問權限,因此我刪除了該用戶,但進程仍然以用戶「1000」的身份繼續運行。如何停止這些進程永久運作?
答案1
如果您刪除了用戶,並且還刪除了用戶可能擁有的任何 cronjobs 等,那麼重新啟動系統應該會殺死它們的進程,而不會在系統再次啟動時重新啟動它們。
如果無法重新啟動,您可以使用下列命令向屬於 UID 1000 使用者的所有進程發送終止訊號
sudu pkill -u 1000
您可以透過先執行來查看哪些進程會受到該指令的影響
pgrep -u 1000
也可以看看man pkill
。
答案2
首先,我將伺服器所有進程的目前狀態儲存到一個檔案中。
ps -wwfax -o uid=,pid=,ppid=,cmd= > /root/list_of_process_as_today.txt
之後我將專注於我的不良用戶。
ps -wwfax -o uid=,pid=,ppid=,cmd= | sed '/^ *1000 *\([0-9][0-9]*\) .*$/p;d'
輸出的範例可以是:
1000 3096 3087 \_ sshd: em444@pts/0
1000 3099 3096 \_ -bash
1000 3543 3099 \_ ps -wwfax -o uid=,pid=,ppid=,cmd=
1000 3544 3099 \_ sed /^ *1000 *\([0-9][0-9]*\) .*$/p;d
1000 21628 1 SCREEN
1000 21629 21628 \_ /bin/bash
行程清單分析
我目前的 shell 是進程 3099 。你可以看到一些子進程,我運行的命令3543,和一位家長3096
你可以看到我有進程21628,他的父進程是進程1, 過程1是所有進程的父進程。
之後我可以使用此命令來終止所有進程。
kill $(/root/list_of_process_as_today.txt | sed 's/^ *1000 *\([0-9][0-9]*\) .*$/\1/p;d')