Archive
Using the SDSF REXX interface – Part 2
Here’s another REXX exec using the SDSF REXX interface. This one will issue a command to the local system.
/**REXX**************************************************************/ /* */ /* ISSUCMD - Issue a command. */ /* */ /* Input args: */ /* */ /* Delay - # secs to wait for command completion */ /* Command - Command to issue (do not need leading /) */ /* */ /* Output: return code from the command. */ /* */ /********************************************************************/ parse arg delay, command Address 'TSO' IsfRC = isfcalls( "ON" ) saved_delay=ISFDELAY /* save curr delay */ ISFDELAY=delay /* Set delay time */ address SDSF "ISFEXEC '/"command"'" saverc=rc ISFDELAY=saved_delay /* restore delay */ IsfRC = isfcalls( "OFF" ) return saverc
Using the above command to start a started task on the local system:
/* REXX */ rc=ISSUCMD(2,"S CICS1") return 0
Using the SDSF REXX interface – Part 1
I thought I’d post some of the REXX execs I have written that use the SDSF REXX interface. This first one determines if a job is executing, either on the specified lpar if passed in or anywhere in the sysplex if not (subject to shared JES spool limits). It returns a return code and, if executing, the lpar the job (or stc) is executing on separated by a space which you can then parse out.
/**REXX**************************************************************/ /* */ /* JOBSTAT - Determine if a job is executing or not */ /* */ /* Input args: */ /* */ /* Jobname - Required. */ /* sysname - Optional. If specified will only look for job on that */ /* system. */ /* */ /* Output: */ /* 0 - Job is not executing (on requested system if specified) */ /* 1 - Job is executing + sysname of system job is running on */ /* */ /********************************************************************/ parse arg jobn , sysname upper jobn upper sysname Address 'TSO' IsfRC = isfcalls( "ON" ) saved_delay=ISFDELAY ISFDELAY=0 executing=0 executing_on="" address SDSF "ISFEXEC ST "jobn if sysname <> "" then do do i = 1 to jname.0 if queue.i = "EXECUTION" & actsys.i = sysname then do executing=1 executing_on=actsys.i end end end else do do i = 1 to jname.0 if queue.i = "EXECUTION" then do executing=1 executing_on=actsys.i end end end ISFDELAY=saved_delay IsfRC = isfcalls( "OFF" ) return executing" "executing_on
Using the above exec to determine if a job is executing on the local lpar:
/**REXX**************************************************************/ /* */ /* Call jobstat to see if job is running in the local system */ /* */ /********************************************************************/ sysname=MVSVAR('SYSNAME') /* local sysname */ parse value jobstat("MYJOB",sysname) with executing lpar if executing then do /* do 'executing' stuff here */ say 'Job is executing' end else do /* Do 'Not executing' stuff here */ say 'Job is not executing' end return 0
Using the above exec to determine if a job is executing in the sysplex and on which lpar:
/**REXX**************************************************************/ /* */ /* Call jobstat to see if job is running anywhere in the sysplex */ /* */ /********************************************************************/ parse value jobstat("MYJOB") with executing lpar if executing then do /* do 'executing' stuff here */ say 'Job is executing on '||lpar end else do /* Do 'Not executing' stuff here */ say 'Job is not executing' end return 0
Still learning afte all these years…
Since the job submission part of my ISPF on the web app is on the brink of working I decided it’d be nice if it could also monitor the status of the jobs in the background, automatically notify you when a job ends and even display the output.
Turns out (and I never knew this because I’d never had to look at it before) that you can run SDSF in REXX.
This just keeps getting better and better.