當您提交作業,pbs_server
傳遞你的任務是pbs_mom
。 pbs_mom
進程/守護進程實際上在執行節點上執行腳本。它
"creates a new session as identical user."
這意味着調用外殼。您可以使用shebang在腳本頂部標記您的選擇:#!/bin/bash
)。
很明顯,那pbs_mom
店處理(殼)PID
某處殺任務,並監視如果作業(shell進程)完成。
UPD。基於@Dmitri Chubarov評論:pbs_mom
在內存中存儲子shell PID
內部調用fork()
後,並在.TK
文件,該文件是torque
安裝目錄下:/var/spool/torque/mom_priv/jobs
我的系統上。
傾銷文件內部以十進制模式(<job_number>
,<queue_name>
應該是你自己的價值觀):
$ hexdump -d /var/spool/torque/mom_priv/jobs/<job_number>.<queue_name>.TK
已經披露,在我的扭矩實現它保存在位置 00000890 + offset 4*2 = 00000898
(這是十六進制值PID
的第一個字節在.TK
文件中),長度爲2
字節。 例如,外殼PID=27110
我:
0000890 00001 00000 00001 00000 27110 00000 00000 00000
讓我們PID
從.TK
文件恢復:
$ hexdump -s 2200 -n 2 -d /var/spool/torque/mom_priv/jobs/<job_number>.<queue_name>.TK | tr -s ' ' | cut -s -d' ' -f 2
27110
這種方式,你已經找到了子shell PID。
現在,執行節點的監控進程列表,找到子進程的名稱(getcpid功能是posted earlier on SO的slighlty修改後的版本):
function getcpid() {
cpids=`pgrep -P $1|xargs`
for cpid in $cpids;
do
ps -p "$cpid" -o comm=
getcpid $cpid
done
}
最後,
getcpid <your_PID>
給你的孩子進程的名字(注意,會有一些垃圾線,如任務號碼)。 這樣您終於可以知道,執行節點上當前正在執行什麼命令。
當然,每個任務監控,你應該做後獲得執行節點上的PID
和進程名
ssh <your node>
可以自動檢索<node/proc+node/proc+...>
節點名稱(S)格式(進一步處理以獲得裸節點名稱):
qstat -n <job number> | awk '{print $NF}' | grep <pattern_for_your_node_names>
備註: PID
方法是可靠的,我相信,最優。 按名稱搜索更糟糕,只有在您的腳本中調用不同的命令並且沒有用戶在節點上執行相同的軟件時,它纔會提供明確的結果。
ssh <your node>
ps aux | grep matlab
你就會知道,如果matlab
運行。
外殼監測$日誌文件的輸出由'pbs_mom'調用的是'pbs_mom'的子進程。 'pbs_mom'只是調用'fork()',它將shell的PID返回到父進程。爲了在'pbs_mom'重新啓動時存活,Torque還將包含PID的作業數據以二進制形式存儲在位於'mom_priv'目錄中的每個作業文件中。 '* .TK'文件包含一個可以用來殺死作業的PID。 –