2015-12-22 62 views
1

我正在嘗試編寫腳本以提供有關進程的診斷信息。我已經使用qsub將腳本提交給作業計劃服務器。我可以輕鬆找到作業發送到的節點。但我希望能夠找到目前正在運行的進程。 即。我在提交的腳本中列出了不同的命令,我如何找到當前正在運行的命令以及傳遞給它的參數?在腳本如何找到在特定的PBS作業上運行的當前進程

matlab -nodesktop -nosplash -r "display('here'),quit" 
python runsomethings.py 

命令

例如,我想查看節點是否當前正在執行的第一或第二行。

回答

1

當您提交作業,pbs_server傳遞你的任務是pbs_mompbs_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運行。

+1

外殼監測$日誌文件的輸出由'pbs_mom'調用的是'pbs_mom'的子進程。 'pbs_mom'只是調用'fork()',它將shell的PID返回到父進程。爲了在'pbs_mom'重新啓動時存活,Torque還將包含PID的作業數據以二進制形式存儲在位於'mom_priv'目錄中的每個作業文件中。 '* .TK'文件包含一個可以用來殺死作業的PID。 –

0

簡單而優雅的方式來做到這一點是打印到日誌文件

`

ARGS=" $A $B $test " 
echo "running MATLAB now with args: $ARGS" >> $LOGFILE 
matlab -nodesktop -nosplash -r "display('here'),quit" 

PYARGS="$X $Y" 
echo "running Python now with args: $ARGS" >> $LOGFILE 
python runsomethings.py 

`

而且使用tail -f $LOGFILE

相關問題