View previous topic :: View next topic
|
Author |
Message |
Digvijay Singh
Active User
Joined: 20 Apr 2022 Posts: 148 Location: India
|
|
|
|
Hi All,
If anyone can give some hint or suggestion.
My requirement is ..i have a JOB having two step my 1st step of job calls a rexx program(this rexx program calls another job internally) and my 2 step call another rexx program. i have to put condition is such a way when my first step run successfully only then second step should run.
I am stuck how here because my 1st step calls a rexx and then rexx in return submit a internal Job which starts with P and some random no. like P12234.
How i can put condition in my main JCl so that when my first step run successfully and also the internal job which is being called in 1st step thorugh rexx should also run successfully then only my 2nd step in my main jcl should run.
Please help me. |
|
Back to top |
|
|
Willy Jensen
Active Member
Joined: 01 Sep 2015 Posts: 734 Location: Denmark
|
|
|
|
Look at the SCHEDULE statement in the JCL reference manual - note, JES2 only. |
|
Back to top |
|
|
Joerg.Findeisen
Senior Member
Joined: 15 Aug 2015 Posts: 1335 Location: Bamberg, Germany
|
|
|
|
Digvijay Singh wrote: |
How i can put condition in my main JCl so that when my first step run successfully and also the internal job which is being called in 1st step thorugh rexx should also run successfully then only my 2nd step in my main jcl should run. |
Your internal job stands in the way because you are using random job names.
PS: I guess, as with your other request, nothing can be changed in the REXX itself. |
|
Back to top |
|
|
Willy Jensen
Active Member
Joined: 01 Sep 2015 Posts: 734 Location: Denmark
|
|
|
|
Should have mentioned, SCHEDULE is part of "JES2 Execution Control Statements", see the "MVS JCL Reference" manual for details. Available since zOS 2.2. |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2594 Location: Silicon Valley
|
|
|
|
Your requirement is wrong.
The second step of the first job should be moved to be the second step of the job that is submitted by the first step. |
|
Back to top |
|
|
Digvijay Singh
Active User
Joined: 20 Apr 2022 Posts: 148 Location: India
|
|
|
|
Hi , Thanks for response.
I dnt have two job i have only one job and 1 step is calling rexx and that rexx is calling the another random job .
My 2nd step should run only when my 1st step rc=0 and also the internal job which is being submitted in first step should aslo finished with rc=0.
Hope i am clear now.
Thanks |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2594 Location: Silicon Valley
|
|
|
|
Quote: |
i have only one job |
Quote: |
Hope i am clear now. |
No, you are not clear at all because two jobs are submitted. It does not matter how they are submitted... they are still two jobs and you seem to have control over both of them. |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2594 Location: Silicon Valley
|
|
|
|
1. Can you tell us how the second job is submitted? If you use the SUBMIT command, you should be able to use OUTTRAP to capture the message displayed.
2. Can you tell us how the random number is generated? You should have 'access' to the number from the rexx program.
3. You can use the SDSF Rexx API to determine the status of the second job. |
|
Back to top |
|
|
Digvijay Singh
Active User
Joined: 20 Apr 2022 Posts: 148 Location: India
|
|
|
|
Hi Please see below: dynamically my jobname is created
[
Code: |
code]
END
ELSE NOP
Time = TIME(LONG) /* Create job name for package execution job */
PARSE VAR Time . '.' Seed
Jobname = 'P'||Seed
and here is the job which is getting submitted from rexx.
Jobline.1 = '//'Jobname' JOB (DCS,058000DCS-058400,2TES-TC3,TESTTEA
Jobline.2 = "// '"TIRID"',CLASS=A,MSGCLASS=S,REGION=0M,"
Jobline.3 = '// MSGLEVEL=(1,0)'
Jobline.4 = '//JOBLIB DD DISP=SHR,DSN=SYS1.ENDEVOR.CSIQAUTU'
Jobline.5 = '// DD DISP=SHR,DSN=SYS1.ENDEVOR.CSIQAUTH'
Jobline.6 = '// DD DISP=SHR,DSN=SYS1.ENDEVOR.CONLIB'
Jobline.7 = "// SET TE='"SUBSTR(Testenv,1,1)"'"
Jobline.8 = "// SET TS='"SUBSTR(Targetstage,1,1)"'"
Jobline.9 = "// SET CCID='"ascd"'"
Jobline.10 = "// SET TID='"TIRID"'"
Jobline.11 = "// SET PKG='"Package"'"
Jobline.12 = "// SET PCD='"ProjCode"'"
Jobline.13 = "// SET JN='"Jobname"'"
Jobline.14 = "//ENBP1000 EXEC PGM=NDVRC1,PARM='ENBP1000',DYNAMNBR=15
Jobline.15 = '//NDVRLOG DD DSN=NDVR.PROD.LOG.ESDS,DISP=SHR'
Jobline.16 = '//C1MSGS1 DD SYSOUT=*'
And this job is getting submitted through condition
IF VErrorflag = 0 & CCIDErrors = 0 & Inspectrc <= 8 THEN
DO
Jobline.1 = '//'Jobname' JOB (DCS,058000DCS-058400,2TES-TC3,TESTTEA
Jobline.2 = "// '"TIRID"',CLASS=A,MSGCLASS=S,REGION=0M," |
Jobline.3 = '// MSGLEVEL=(1,0)' [/code]
F2=Split F3=Exit F4=Expand F5=Rfind F6=Rchange
F8=Down F9=Swap F10=Left F11=Right F12=Cancel
|
|
Back to top |
|
|
Willy Jensen
Active Member
Joined: 01 Sep 2015 Posts: 734 Location: Denmark
|
|
|
|
You can monitor a job using the REXX/SDSF API.
So something like this:
Step 1 generates and submits the 2nd job, then goes into a loop monitoring the progress of the submitted job. When the job has finished then the rc is kept. RC for step 1 is then set based on the rc from job2.
Note that you really should have a wait between the job status checks in the loop.
Use something like this to get the job status:
Code: |
zz=isfcalls('ON')
isfprefix=userid() /* <- jobname/prefix */
Address SDSF "ISFEXEC ST (delayed)" |
|
|
Back to top |
|
|
Digvijay Singh
Active User
Joined: 20 Apr 2022 Posts: 148 Location: India
|
|
|
|
Thanks for your response.
My job is not available in spool it is being directed to Savers. |
|
Back to top |
|
|
Willy Jensen
Active Member
Joined: 01 Sep 2015 Posts: 734 Location: Denmark
|
|
|
|
You are not makng this easy.
Could you leave the job in spool and only reroute it to a SAVERS class when you have checked it's state?
Otherwise I can only suggest that you rethink the entire process. |
|
Back to top |
|
|
Digvijay Singh
Active User
Joined: 20 Apr 2022 Posts: 148 Location: India
|
|
|
|
I have no other way.
is it possible to set the return code of calling step on the basis of return code of internal job which is getting submitted through rexx..? |
|
Back to top |
|
|
Willy Jensen
Active Member
Joined: 01 Sep 2015 Posts: 734 Location: Denmark
|
|
|
|
Only if you monitor the submitted job somehow....
Or, can you make the submitted job write a status to a dataset, so that you can monitor the dataset? |
|
Back to top |
|
|
Willy Jensen
Active Member
Joined: 01 Sep 2015 Posts: 734 Location: Denmark
|
|
|
|
add 3 steps to the submitted job:
at top - (re)create dataset with content 'INIT'.
after, with condcode check:
if cc=0 then write 'OK' to dataset.
if cc<>0 then write 'FAIL' to dataset.
A thought, SAVERS, I believe, have a REXX interface, use that to check status? |
|
Back to top |
|
|
Digvijay Singh
Active User
Joined: 20 Apr 2022 Posts: 148 Location: India
|
|
|
|
I am sorry if i didnt get this right.
what i am thinking ..
1> 1st step submitted and internal rexx submitted the job ..can we direct this job RC to a data set and if that data set has RC = 00 we can use sort and all to fetch the rc and basis on which we can run 2nd step. |
|
Back to top |
|
|
Willy Jensen
Active Member
Joined: 01 Sep 2015 Posts: 734 Location: Denmark
|
|
|
|
yes, you can add a step to the submitted job to pull the rc from a previous step, and save that info to a dataset. Use the REXX/SDSF API. However do you really need the actual rc, or is zero/notzero sufficient? If so, use the setup I outlined earlier. |
|
Back to top |
|
|
Digvijay Singh
Active User
Joined: 20 Apr 2022 Posts: 148 Location: India
|
|
|
|
when you are saying the submitted job it means interanl job right which is getting submitted from rexx?
add 3 steps to the submitted job:
at top - (re)create dataset with content 'INIT'.
after, with condcode check:
if cc=0 then write 'OK' to dataset.
if cc<>0 then write 'FAIL' to dataset.
yes i am only bother about zero or non zero as of now.
could you give piece of code of the above solution am bad at JCL and new here like what i will check in my 2nd step conditon i am not sure ...? |
|
Back to top |
|
|
sergeyken
Senior Member
Joined: 29 Apr 2008 Posts: 2141 Location: USA
|
|
|
|
First of all you need to understand that any JCL job cannot be called neither from REXX, nor from any other place. All JCL jobs can be only submitted; and after that the job is running independently from its submitter. It may require non-trivial tricks to "check the return code" produced by a step of an independently running job.
In case I knew what your actual intentions are, I would re-design your schema of execution from scratch. Simple things must be done using simple methods.
So far it looks like the flight for Boston to New York with transfer on the Moon. It is possible, but makes no sense. |
|
Back to top |
|
|
prino
Senior Member
Joined: 07 Feb 2009 Posts: 1315 Location: Vilnius, Lithuania
|
|
|
|
You're trying to do what a scheduler does. This is not allowed on this forum!
What would happen if the "random" job never starts?
This thread needs to be locked! |
|
Back to top |
|
|
Digvijay Singh
Active User
Joined: 20 Apr 2022 Posts: 148 Location: India
|
|
|
|
answer to last two post..
1st> I may be wrong but i am sure we can submit a skelton having batch job through rexx.
2> Sometime you automate the things the requirement could be strange but nothing more you can do about it, we have to find out approach and try your best you can achieve that.
1> My question was very simple i want to capture the rc of internal job and basis on that i will be running my second step.
and i guess we can achive this but being new in the rexx bit of struggle for me.
Thanks for your point of views. |
|
Back to top |
|
|
sergeyken
Senior Member
Joined: 29 Apr 2008 Posts: 2141 Location: USA
|
|
|
|
Digvijay Singh wrote: |
1st> I may be wrong but i am sure we can submit a skelton having batch job through rexx.
|
Once again: you can SUBMIT a JCL produced from a skeleton, but under no circumstances you can CALL a JCL, from anywhere.
My point is: you are not able to understand the principal difference between CALLING, and SUBMITTING.
(And also: the difference between JCL customization from a skeleton as text data, and submitting the same text as JCL code)
Digvijay Singh wrote: |
1> My question was very simple i want to capture the rc of internal job and basis on that i will be running my second step.
|
Your question seems to be simple, but the answer is too complex unless you understand the possibilities to communicate between parallel processes.
Main point: why not to add the whole "second job" as some // IF-ELSE portion of the first job, to be either executed, or bypassed depending on the RC produced by your specific job step? What is the need to split the whole process into two independent JCLs, while they are not really independent???
Digvijay Singh wrote: |
and i guess we can achive this but being new in the rexx bit of struggle for me.
|
It has nothing to do with REXX, or any other language. You need to understand the available options that can be used in MVS to control several INDEPENDENT processes running IN PARALLEL. |
|
Back to top |
|
|
Willy Jensen
Active Member
Joined: 01 Sep 2015 Posts: 734 Location: Denmark
|
|
|
|
Ok, here is some JCL:
Code: |
//S0 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSUT2 DD DISP=SHR,DSN=statds
//SYSUT1 DD *
INIT
//*
//ENBP1000 EXEC PGM=whatever
//*
// IF ENBP1000.RC = 0 THEN
//S1 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSUT2 DD DISP=SHR,DSN=statds
//SYSUT1 DD *
OK
// ELSE
//S2 EXEC PGM=IEBGENER
//SYSPRINT DD SYSOUT=*
//SYSIN DD DUMMY
//SYSUT2 DD DISP=SHR,DSN=statds
//SYSUT1 DD *
FAIL
// ENDIF
//* |
But I agree with sergeyken, you really should do your dependent processing in the submitted job. |
|
Back to top |
|
|
sergeyken
Senior Member
Joined: 29 Apr 2008 Posts: 2141 Location: USA
|
|
|
|
It is very difficult to understand something from the tattered cramps of your code.
I try to understand it in my own manner.
Code: |
Time = TIME(LONG) /* Create job name for package execution job */
PARSE VAR Time . '.' Seed
Jobname = 'P'||Seed
/* and here is the job which is getting submitted from REXX */
Queue '//'Jobname' JOB (DCS,058000DCS-058400,2TES-TC3,TESTTEA'
Queue "// '"TIRID"',CLASS=A,MSGCLASS=S,REGION=0M,"
Queue '// MSGLEVEL=(1,0)'
Queue '//JOBLIB DD DISP=SHR,DSN=SYS1.ENDEVOR.CSIQAUTU'
Queue '// DD DISP=SHR,DSN=SYS1.ENDEVOR.CSIQAUTH'
Queue '// DD DISP=SHR,DSN=SYS1.ENDEVOR.CONLIB'
Queue "// SET TE='"SUBSTR(Testenv,1,1)"'"
Queue "// SET TS='"SUBSTR(Targetstage,1,1)"'"
Queue "// SET CCID='"ascd"'"
Queue "// SET TID='"TIRID"'"
Queue "// SET PKG='"Package"'"
Queue "// SET PCD='"ProjCode"'"
Queue "// SET JN='"Jobname"'"
Queue "//ENBP1000 EXEC PGM=NDVRC1,PARM='ENBP1000',DYNAMNBR=15
Queue '//NDVRLOG DD DSN=NDVR.PROD.LOG.ESDS,DISP=SHR'
Queue '//C1MSGS1 DD SYSOUT=*'
/* NO NEED TO SUBMIT THIS FRAGMENT OF THE WHOLE JCL RIGHT HERE!!! */
If VErrorflag = 0 & CCIDErrors = 0 Then Do /* conditionally include Part 2 JCL */
Queue '//* Place here the second part of your job '
Queue "// IF (ENBP1000.RC <= 8) THEN"
Queue '//PART2 EXEC PGM=whatever'
Queue '//. . . all JCL stetements needed for Part 2'
Queue '//* End of Part 2 conditionally included,
Queue '//* and conditionally executed as a part of the single JCL'
Queue '// ENDIF'
End
/* Now write the whole JCL from program stack into a dataset */
"EXECIO * DISKW OUTJCL (FINIS"
/* here you can submit your single JCL in the same manner you did it before */
|
From your very long explanation it is still unclear: what are those secret conditions, and where do they come from?
Code: |
VErrorflag = 0 & CCIDErrors = 0 |
P.S.
Now there is no trace of previously used skeletons, and FTS calls? |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2594 Location: Silicon Valley
|
|
|
|
Quote: |
What is the need to split the whole process into two independent JCLs, while they are not really independent??? |
I think that Digvijay still does not understand that the two jobs run asynchronously. It is undesirable for one job to wait for the other job to execute (it could run much later in the day, or as Prino pointed out: it might not ever run).
I repeat my suggestion:
The second step of the first job should be moved to be the second step of the job that is submitted by the first step. |
|
Back to top |
|
|
|