仰望高端玩家的小清新 http://www.cnblogs.com/luruiyuan/
有時候我們常常會有一個需求是監控GPU指定情況,並且需要根據需要殺死GPU進程
這里介紹幾個與之相關的指令:
watch -n 秒數 命令 :每隔指定秒數,就執行一次命令,並將結果打印在屏幕上
例如:
watch -3 nvidia-smi
watch -n 3 nvidia-smi
上述命令每隔三秒就輸出一次GPU列表信息
通過 nvidia-smi 可以輸出使用GPU的進程ID,因此可以借助 awk 工具對 nvidia-smi 的輸出進行過濾,從而找到進程信息,再對指定進程進行kill
例如:
要終止GPU-0到GPU-3的所有進程中,PID大於1000的,可以使用如下指令完成:
kill -9 $(nvidia-smi | awk '$2 == "GPU" && $3 == "PID" {flag = 1} flag && $3 > 0 {print $2, $3}' | awk '$1 < 4 && $2 > 1000 {print $2}')
kill -9 PIDs 需要所有待停止的進程編號,而 nvidia-smi 經過第一個 awk 的輸出為:
GPU PID
0 10053
1 3343
再經過第二個awk后,即可對GPU ID 和PID進行篩選,並輸出 {print $2},可以得到:
10053
3343
最后,通過 $() 對輸出的 PID 進行讀取,完成kill過程。
同樣的,結合 watch 指令,我們可以周期性地清理占用GPU的僵屍進程
例如,每分鍾清理一次:
sudo watch -n 60 kill -9 $(nvidia-smi | awk '$2 == "GPU" && $3 == "PID" {flag = 1} flag && $3 > 0 {print $2, $3}' | awk '$1 < 4 && $2 > 1000 {print $2}')
或者防止非法用戶訪問GPU:
sudo watch -n 60 kill -9 $(for x in $(nvidia-smi | awk '$2 == "GPU" && $3 == "PID" {flag = 1} flag && $3 > 0 {print $2, $3}' | awk '$1 < 4 && $2 > 1000 {print $2}'); do ps -aux | awk '$2 == '$x' && $1 == "illigal_user_name" {print $2}'; done)
原始問題和我的回答見:這里,網址:https://unix.stackexchange.com/questions/250244/how-to-kill-all-processes-using-a-given-gpu/511668#511668