Вт, 26.11.2024, 10:22
Приветствую Вас Гость | RSS
Главная | Jobname & Jobid - Форум | Регистрация | Вход
Форма входа
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Jobname & Jobid
GregoryДата: Ср, 06.06.2012, 17:17 | Сообщение # 1
Генерал-майор
Группа: Доверенные
Сообщений: 482
Репутация: 22
Статус: Offline
В программе/процедуре, выполняющейся в пакетном задании, требуется получить имя этого задания и его id. Казалось бы, все просто:
TCB = c2d(storage(21C,4)) /* current TCB */
или "от печки"
CVT = '10' /* CVT absolute address */
TCB = c2x(storage(c2x(storage(c2x(storage(CVT,4)),4)),4)) /* current TCB */
затем
TIOT = c2d(storage(d2x(TCB+12),4))
JBNM = strip(storage(d2x(TIOT),8)) /* jobname */
JSCB = c2d(storage(d2x(TCB+180),4))
SSIB = c2d(storage(d2x(JSCB+316),4))
JBID = storage(d2x(SSIB+12),8) /* jobid */
Подобный код можно найти на самых разных сайтах. Но... если вызываемая программа/процедура выполняется в z/OS UNIX, например, в таком задании:
//AOPBATCH EXEC PGM=AOPBATCH,REGION=0M,PARM='/sh'
//STDOUT DD SYSOUT=*
//STDERR DD SYSOUT=*
//STDIN DD *
/u/gregory/rexx_script ;
//
приведенный выше код не определяет jobid. Причина в том, что AOPBATCH (BPXBATCH) выполняет программу, в данном случае shell, в отдельном адресном пространстве (*OMVSEX, при выполнении задания можно заметить это, наблюдая за SDSF.DA). Так как же в таком случае найти jobid? Вопрос обсуждался здесь
где предлагалось использовать такой код:
tcb = C2D(STORAGE(21C,4)) /* get current TCB */
jsab = 0 /* null pointer */
if tcb \= 0 then do
stcb = C2D(STORAGE(D2X(tcb+312),4))
jsab = C2D(STORAGE(D2X(stcb+188),4))
end
if jsab = 0 then do
ascb = C2D(STORAGE(224,4)) /* get current TCB */
assb = C2D(STORAGE(D2X(ascb+336),4))
jsab = C2D(STORAGE(D2X(assb+168),4))
end
jbnm = STORAGE(D2X(jsab+28),8)
jbid = STORAGE(D2X(jsab+20),8)
отсюда
Но этот код задачу не решает, он находит jobid BPXOINIT (т.е. STC02119 например) surprised
Так как же все-таки найти jobid в этом случае?
 
AKonevДата: Пт, 08.06.2012, 10:33 | Сообщение # 2
Лейтенант
Группа: Проверенные
Сообщений: 66
Репутация: 5
Статус: Offline
Может быть вот это поможет
When a new address space is created as part of a fork/spawn call,
USS will typically add a numeric suffix to differentiate the
parent process from the child process. It only does this IF the
parent process has a jobname of 7 characters or less. With a
jobname of 8 characters, USS will not add a numeric suffix to the
jobname.

With OMVS processes, each process has a Process ID (PID) and when
a child process is created, the PID of the Parent is recorded as
the PPID. You can use this Parent PID (PPID) to find the parent
that started this process.
Идея такая:
Надо будет с помощью procinfo() определить собственный PID процесса и его родительский процесс (PPID)
и затем указав в procinfo родительский процесс много чего достать, во всяком случае ASID и JOBNAME точно.
 
GregoryДата: Вт, 12.06.2012, 18:37 | Сообщение # 3
Генерал-майор
Группа: Доверенные
Сообщений: 482
Репутация: 22
Статус: Offline
увы, этот путь ведет туда же... PPID указывает на BPXINIT.
Сегодня весь день я безуспешно рылся в управляющих блоках пытаяясь найти связь между адресными пространствами -

ASCB ASID JOBNAME JOBID
FACC80 28 IBMUSER0 JOB03713 <--- это задание
...
F9B700 129 IBMUSER0 STC03709 <--- это spawned OMVS

А связь должна быть! В любом случае, спасибо за обсуждение!
P.S. если имя исходного задания не 8 символов, а меньше, то и jobname ассоциированное со spawned OMVS не будет совпадать с оригинальным - добавляется цифра справа


Сообщение отредактировал Gregory - Вт, 12.06.2012, 18:41
 
AKonevДата: Ср, 13.06.2012, 11:51 | Сообщение # 4
Лейтенант
Группа: Проверенные
Сообщений: 66
Репутация: 5
Статус: Offline
Не поленился запустил некий скрипт, который подвисает на минуту
Выдал команду
D OMVS,A=ALL
Процесс у которого PPID равен 1 и есть наш шаг задания, который вызвал в два этапа, сначала sh,а затем некий REXX скрипт rx1.
То есть схема выглядит так:
1. Сначала определяем свой ASID
2. Далее через procinfo из списка процессов находим первый попавшийся процесс нашего ASID
3. Указывая в procinfo номер процесса, добираемся до процесса у которого PPID = 1. Это и будет AOPBATCH
4. Для его ASID определяем JOBID

D OMVS,A=ALL
BPXO070I 11.23.09 DISPLAY OMVS 863
....
USER JOBNAME ASID PID PPID STATE START CT_SECS
....
KONEV KONEVA1 00BB 50331739 50331743 1R------ 11.23.02 6.9
LATCHWAITPID= 0 CMD=/user/konev/rx1
KONEV KONEVA 001B 67108956 1 1FI----- 11.23.01 .0
LATCHWAITPID= 0 CMD=AOPBATCH
KONEV KONEVA1 00BB 50331743 67108956 1W------ 11.23.02 6.9
LATCHWAITPID= 0 CMD=sh
 
GregoryДата: Ср, 13.06.2012, 15:27 | Сообщение # 5
Генерал-майор
Группа: Доверенные
Сообщений: 482
Репутация: 22
Статус: Offline
hands превосходно!
Code

/* REXX */
numeric digits 20
call syscalls 'ON'
address syscall 'getpid'
pid = retval
BPXW_ASID = ''
/* look for ASID of process 1 (AOPBATCH) */
do while pid <> 1
rc=procinfo(pid)
pid = BPXW_PPID
end
/* scan ASCB's for found ASID */
CVT = c2d(storage(10,4))
CVTASVT = c2d(storage(d2x(CVT+556),4))
ASVTMAXU = c2d(storage(d2x(CVTASVT+516),4))
do i = 1 To ASVTMAXU
ASCB = c2d(storage(d2x(CVTASVT+528+(i-1)*4),4))
if storage(d2x(ASCB+0),4) <> 'ASCB'
then iterate i
ASID = c2d(storage(d2x(ASCB+36),2))
if ASID = BPXW_ASID
then do
ASSB = c2d(storage(d2x(ASCB+336),4))
JSAB = c2d(storage(d2x(ASSB+168),4))
JBNM = storage(d2x(JSAB+28),8)
JBID = storage(d2x(JSAB+20),8)
say ASID JBNM JBID
end
end i

результат: 46 IBMUSER0 JOB03979, т.е. то, что и требовалось.

Не понимаю, почему у меня вчера это не получилось cry Спасибо!


Сообщение отредактировал Gregory - Чт, 14.06.2012, 10:45
 
  • Страница 1 из 1
  • 1
Поиск: