Как мне найти текущий процесс, выполняющийся на определенном задании PBS?

Я пытаюсь написать скрипт для обеспечения диагностики процессов. Я отправил скрипт на сервер планирования заданий, используя qsub. Я легко могу найти узел, на который отправляется задание. Но я бы хотел узнать, какой процесс выполняется в данный момент. то есть. У меня есть список различных команд в представленном скрипте, как я могу найти текущую запущенную и переданные ей аргументы?

пример команд в скрипте

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

Я хотел бы видеть, выполняет ли узлы в настоящее время первую или вторую строку.

2 ответа

Когда вы отправляете работу, pbs_server передать свою задачу pbs_mom, pbs_mom process/daemon фактически выполняет ваш скрипт на узле выполнения. Это

msgstr " создает новую сессию как идентичный пользователь."

Это означает вызов оболочки. Вы специализируете оболочку в верхней части скрипта, отмечая ваш выбор шебангом: #!/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

Другие вопросы по тегам