Reputation: 1179
In the following JCL, the HFS path /u/woodsmn/jjk does not exist. It raises a JCL error and does not run the COPYHFS step, nor any other steps. I want it to detect the missing file, and run the FAILIND step.
I suspect MVS raises a JCL error and completely ignores any COND conditions that might apply. I was hoping it raise some failure step condition code and behave that way.
How can I re-write this to execute steps when a PATH does not exist?
//WOODSMN1 JOB (1111),MSGLEVEL=(1,1),CLASS=A,MSGCLASS=H,
// USER=WOODSMN,REGION=1M
//COPYHFS EXEC PGM=IKJEFT01
//INHFS DD PATH='/u/woodsmn/jjk',
// PATHOPTS=(ORDONLY),RECFM=VB,LRECL=255,BLKSIZE=32760
//OUTMVS DD DSN=WOODSMN.TESTDS1,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1)),
// DCB=(LRECL=80,RECFM=FB,BLKSIZE=8080)
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
OCOPY INDD(INHFS) OUTDD(OUTMVS) CONVERT(NO)
/*
//*
//NETVIEW EXEC PGM=IEFBR14,COND=(0,EQ,COPYHFS)
//*
//SUCCIND EXEC PGM=IEBGENER,REGION=1M,COND=(0,EQ,NETVIEW)
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD *
Attempt to put file succeeded
/*
//SYSUT2 DD PATHOPTS=(ORDWR,OTRUNC,OCREAT),PATHMODE=SIRWXU,
// PATHDISP=(KEEP,DELETE),
// PATH='/u/woodsmn/TESTDS.SUCCESS'
//SYSIN DD DUMMY
//*
//FAILIND EXEC PGM=IEBGENER,REGION=1M,COND=(0,GT,NETVIEW)
//SYSPRINT DD SYSOUT=*
//SYSUT1 DD *
Attempt to put file failed
/*
//SYSUT2 DD PATHOPTS=(ORDWR,OTRUNC,OCREAT),PATHMODE=SIRWXU,
// PATHDISP=(KEEP,DELETE),
// PATH='/u/woodsmn/TESTDS.FAIL'
//SYSIN DD DUMMY
//
Upvotes: 1
Views: 958
Reputation: 2735
Two things to change:
Firstly, run IKJEFT1B
instead of IKJEFT01
, because the former will end when a command in SYSTSIN
ends with a non-zero returncode, and that return code will become the step return code.
Secondly, allocate the z/OS UNIX file with the ALLOC
command just before the OCOPY
. ALLOC
will return with RC=12 if it cannot allocate the file (for whatever reason).
So, your first step should look like this:
//COPYHFS EXEC PGM=IKJEFT1B
//OUTMVS DD DSN=WOODSMN.TESTDS1,
// DISP=(NEW,CATLG,DELETE),
// SPACE=(TRK,(1,1)),
// DCB=(LRECL=80,RECFM=FB,BLKSIZE=8080)
//SYSTSPRT DD SYSOUT=*
//SYSTSIN DD *
ALLOC F(INHFS) PATH('/u/woodsmn/jjk') -
PATHOPTS(ORDONLY) RECFM(V B) LRECL(255) BLKSIZE(32760)
OCOPY INDD(INHFS) OUTDD(OUTMVS) CONVERT(NO)
/*
You can then test the return code from the COPYHFS
step as usual. (And btw, you don't need that NETVIEW
step, but instead test the return code from the COPYHFS
step directly.)
IKJEFT1B
, as well as IKJEFT01
, and the third variation IKJEFT1A
are described in Appendix A. Executing the terminal monitor program in the manual z/OS TSO/E Customization.
Upvotes: 1
Reputation: 10765
Use BPXBATCH to execute a shell command to test the existence of your directory.
//EXIST001 EXEC PGM=BPXBATCH,PARM='SH test -e /u/woodsmn/jjk'
//STDOUT DD SYSOUT=*
//STDERR DD SYSOUT=*
You may have to get a bit more exotic and use the STDPARM DD to pass a `set -o errexit' to get the return code to work exactly as you wish.
Upvotes: 2