Как мне найти текущий процесс, выполняющийся на определенном задании PBS?
Я пытаюсь написать скрипт для обеспечения диагностики процессов. Я отправил скрипт на сервер планирования заданий, используя qsub. Я легко могу найти узел, на который отправляется задание. Но я бы хотел узнать, какой процесс выполняется в данный момент. то есть. У меня есть список различных команд в представленном скрипте, как я могу найти текущую запущенную и переданные ей аргументы?
пример команд в скрипте
matlab -nodesktop -nosplash -r "display('here'),quit"
python runsomethings.py
Я хотел бы видеть, выполняет ли узлы в настоящее время первую или вторую строку.
2 ответа
Когда вы отправляете работу, pbs_server
передать свою задачу pbs_mom
, pbs_mom
process/daemon фактически выполняет ваш скрипт на узле выполнения. Это
Это означает вызов оболочки. Вы специализируете оболочку в верхней части скрипта, отмечая ваш выбор шебангом: #!/bin/bash
).
Понятно, что pbs_mom
хранит процесс (оболочку) PID
где-нибудь, чтобы убить работу и следить за ее завершением.
UPD. на основании комментария @Dmitri Chubarov: pbs_mom
магазины скорлупы 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
Таким образом, вы нашли PID подоболочки.
Теперь проследите за списком процессов на узле выполнения и найдите имя дочерних процессов (функция getcpid - это слегка измененная версия, ранее опубликованная в SO):
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+...>
формат (обработайте его далее, чтобы получить голые имена узлов):
qstat -n <job number> | awk '{print $NF}' | grep <pattern_for_your_node_names>
Примечание: PID
Метод надежный и, как я считаю, оптимальный. Поиск по имени хуже, он дает вам однозначный результат, только если вы вызываете различные команды в ваших скриптах, и ни один пользователь не выполняет одно и то же программное обеспечение на узле.
ssh <your node>
ps aux | grep matlab
Вы будете знать, если matlab
пробеги.
Простой и элегантный способ сделать это - распечатать файл журнала
`
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
`
И контролировать вывод $LOGFILE, используя tail -f $LOGFILE