View previous topic :: View next topic
|
Author |
Message |
James Emerson
New User
Joined: 26 Mar 2009 Posts: 5 Location: Brisbane
|
|
|
|
Greetings,
I am writing a REXX (JERECALL) that will be called via MYLOGON to recall migrated datasets.
I would like to call this REXX via MYLOGON, so it happens automatically. I have used LMDINIT & LISTDSI in JERECALL to retrieve a list of datasets, then iterate through them only recalling datasets that are flagged as migrated. However, I found that the certain commands can only be execute during an ISPF session and MYLOGON executes before ISPF is loaded. I could call the JERECALL rexx via the ISPSTART command and the LMDINIT & LISTDSI commands work. My next hurdle was the JERECALL was interrupted by the "Specify Disposition of Log Data Set" screen, which requests manual intervention to select a process option and press enter to continue past this screen. I overcame this by disabling the Log Data Set in my ISPF Settings under Log Dataset defaults.
I have read through the ISPSTART syntax:
publib.boulder.ibm.com/infocenter/zos/v1r12/index.jsp?topic=%2Fcom.ibm.zos.r12.f54dg00%2Fhstart.htm
My questions are:
1. Is there a way to call ISPSTART with a /nolog option, or a way to close the dataset manually?
2. Is there a better way to do what I am doing?
MYLOGON looks like this:
Code: |
"ISPSTART CMD(%JERECALL USERID) MODE(FSCR) NEWAPPL(LALA)" |
JERECALL looks like this:
Code: |
ADDRESS TSO
ARG UID
DSN = UID || '.*'
MSGVAL = MSG('OFF')
"ISPEXEC LMDINIT LISTID(LID) LEVEL(&DSN)"
DO I = 1 TO 1000
"ISPEXEC LMDLIST LISTID("LID") OPTION(LIST) DATASET(DSN)"
IF RC = 0 THEN
DO
QDSN = "'" || DSN || "'"
FC = LISTDSI(QDSN NORECALL)
IF FC = 16 & SYSREASON = 9 THEN "HRECALL" QDSN "NOWAIT"
END
ELSE LEAVE
END /* DO I */
MSGVAL = MSG(MSGVAL)
EXIT 0 |
For those interested, to disable the Log Data Set:
At the ISPF main menu.
0 Settings Terminal and user parameters
Log/List - Top left menu
1. Log Data set defaults
Code: |
EsssssssssssssssssssssssssssssssssssssN
e 1 1. Log Data set defaults e
e 2. List Data set defaults e
e 3. List Data set characteristics e
e 4. JCL... e
DsssssssssssssssssssssssssssssssssssssM |
Change the Primary pages and Secondary pages to 0.
Code: |
Essssssssssssssssssssssssssss ISPF Settings ssssssssssssssssssssssssssssN
e Log Data Set Defaults e
e More: + e
e Process option . . . . 2 1. Print data set and delete e
e 2. Delete data set (without printing) e
e 3. Keep data set (append subsequent e
e information to same data set) e
e 4. Keep data set and allocate new data set e
e Batch SYSOUT class . . e
e Local printer ID or e
e writer-name . . . . . e
e Local SYSOUT class . . e
e Lines per page . . . . 60 e
e Primary pages . . . . 0 e
e Secondary pages . . . 0 e
e Log Message ID . . . . (/ = Yes) e
e F1=Help F2=Split F3=Exit F7=Backward F8=Forward e
e F9=Swap F12=Cancel e
DsssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssssM |
Please note: If you have performed actions in the ISPF session, the log/list dataset will have already been created. This means you will see the "Specify Disposition of Log Data Set" screen 1 last time. The next time you log in and perform actions, the dataset will NOT be created and the screen will not appear when you go to exit.
Thank you for your assistance.
Regards,
James Emerson |
|
Back to top |
|
|
PeterHolland
Global Moderator
Joined: 27 Oct 2009 Posts: 2481 Location: Netherlands, Amstelveen
|
|
Back to top |
|
|
Stefan
Active User
Joined: 12 Jan 2006 Posts: 110 Location: Germany
|
|
|
|
James Emerson wrote: |
Is there a better way to do what I am doing? |
Look at the LISTDSI TSO/E external function. The statement x = LISTDSI('my.data.set' 'NORECALL') will populate the REXX variable sysreason with a value of 9 if DFHSM migrated the dataset. The parameter 'NORECALL' itself prevents the retrieval of the dataset.
Using this function there will be no need for an active ISPF environment anymore and thus you can get rid of ISPSTART. |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2547 Location: Silicon Valley
|
|
|
|
Quote: |
2. Is there a better way to do what I am doing? |
You are using LMDINIT and LMDLIST to get the names of datasets. You should use OUTTRAP and LISTCAT instead. This would remove the requirement to start ISPF first.
-OR- you could stop trying to circumvent the storage management policies and only recall datasets when you need them. |
|
Back to top |
|
|
dick scherrer
Moderator Emeritus
Joined: 23 Nov 2006 Posts: 19244 Location: Inside the Matrix
|
|
|
|
Hello,
Quote: |
you could stop trying to circumvent the storage management policies and only recall datasets when you need them. |
Has someone told you that your convenience is worth the negative impact on the system?
As Pedro mentions, it is best to recall datasets when needed - Not have them always available.
Possibly i misunderstand. |
|
Back to top |
|
|
don.leahy
Active Member
Joined: 06 Jul 2010 Posts: 765 Location: Whitby, ON, Canada
|
|
|
|
dick scherrer wrote: |
Hello,
Quote: |
you could stop trying to circumvent the storage management policies and only recall datasets when you need them. |
Has someone told you that your convenience is worth the negative impact on the system?
As Pedro mentions, it is best to reacll datasets when neede - Not have them always available.
Possibly i misunderstand. |
In our shop we actually have an officially sanctioned tool that facilitates mass HRECALLs of data base data sets. The reason it exists is that we have a lot of distributed apps that communicate with our host data bases via IMS/Connect, JDBC and MQ. The folks who develop those applications usually have minimal mainframe knowledge so the tool makes it easy for them to perform their own recalls.
The tool also optionally resets the 'last used' date on unmigrated data sets so that migration can be prevented.
I used to have my own clandestine tool that did this sort of thing, and I always felt a little bit guilty whenever I used it. Not any more; I have retired it and now use the official tool with a clear conscience. |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2547 Location: Silicon Valley
|
|
|
|
Quote: |
facilitates mass HRECALLs of data base data sets. |
I suppose it is the number of recalls that might be a problem. Twenty or so datasets might not be noticed.
But, for example, my HLQ has 1700+ datasets. Recalling that many datasets would be noticed. Someone with large numbers of datasets cannot unilaterally decide to have every dataset online all of the time. |
|
Back to top |
|
|
don.leahy
Active Member
Joined: 06 Jul 2010 Posts: 765 Location: Whitby, ON, Canada
|
|
|
|
A typical test data base in our shop (consisting of DB2 table spaces and IMS data bases) has over 3,000 data sets, so some of our recalls are large.
It's a question of trade offs. It would certainly be possible to exempt data base data sets from migration and therefore avoid the need to recall them. This of course would greatly increase the space utilization on the primary volumes. Years ago it was decided that it was preferable to migrate the data sets after n days of disuse and put up with the occasional large recall. |
|
Back to top |
|
|
James Emerson
New User
Joined: 26 Mar 2009 Posts: 5 Location: Brisbane
|
|
|
|
PeterHolland
Your suggestion works.
I changed JERECALL EXIT 0 to EXIT 4.
As long as you have a default action set 1,2,3,4 it will perform that one with out displaying the screen. If you do not have a default set, the screen still displays.
As I have set up a default of 2 (Delete data set without printing) this allows me to keep my Log/List and run this rexx to recall my datasets.
Thank you for that PeterHolland.
Stefan
I am not sure I understand your solution.
Are you saying that I should just remove the 'NORECALL' from the LISTDSI statement from the JERECALL REXX and then I can remove the ISPSTART from the MYLOGON REXX?
If I perform this,
MYLOGON:
JERECALL:
Code: |
"ISPEXEC LMDINIT LISTID(LID) LEVEL(&DSN)"
"ISPEXEC LMDLIST LISTID("LID") OPTION(LIST) DATASET(DSN)" |
Both the ISPEXEC return the following error as ISPSTART is not used in MYLOGON to call JERECALL:
Code: |
ISPS118L SERVICE NOT INVOKED. A VALID ISPF ENVIRONMENT DOES NOT EXIST. |
Code: |
FC = LISTDSI(QDSN NORECALL) |
Without the 'NORECALL' you are very right, it automatically recalls.
However I believe it increases the time of the MYLOGON execution as it waits for the recall to complete before moving to the next dataset. And it returns the following message for each dataset that is migrated:
Code: |
ARC1020I DFSMSHSM IS RECALLING FROM DASD DSN=DATASETNAME, YOU MAY CONTIN
UE THE RECALL IN THE BACKGROUND AND FREE YOUR TSO SESSION BY PRESSING THE ATTENT
ION KEY |
To overcome that problem, I added the 'NORECALL' option to the LISTDSI call. I also found it gave me more control over what I was recalling, as I could report a list of migrated datasets that have been recalled.
If I have mis-understood your suggestion please let me know.
Thank you Stefan for the feedback.
Pedro
I have had a read of the following:
OUTTRAP:
publib.boulder.ibm.com/infocenter/zos/v1r12/index.jsp?topic=%2Fcom.ibm.zos.r12.ikjc300%2Ftrap.htm
LISTCAT:
publib.boulder.ibm.com/infocenter/zos/v1r12/index.jsp?topic=%2Fcom.ibm.zos.r12.idai200%2Fdgt2i29067.htm
I have implemented your suggestion, and it looks like this (please let me know if i have mis-interpreted what you wrote)
Code: |
ADDRESS TSO
x = OUTTRAP('var.')
"LISTCAT"
DO i = 2 TO var.0
dsn = "'" || var.i || "'"
SAY i 'recalling:' || dsn || ':'
"HRECALL" dsn "NOWAIT"
END
x = OUTTRAP('OFF') /* turns trapping OFF */
exit 0 |
You are very right, I no longer require the ISPSTART to run this as the LISTCAT and HRECALL are TSO.
However it does not seem to trap the following spam:
Code: |
ARC1001I USERID.DATASETNAME RECALL FAILED, RC=0002, REAS=0000
ARC1102I DATA SET IS NOT MIGRATED/BACKED UP |
I have very few datasets personally, less then 100. It would be a pain if someone had to press enter every screen as it generates 2 lines for every dataset that is not migrated.
Thank you for your suggestion Pedro
Pedro & dick scherrer
You are correct, that it could be seen as circumventing the storage management policies.
At our site, our datasets vanish after a few weeks. I am mainly writing this REXX to recall my datasets when I go on leave for a month+. I will ask someone to add this to their log on, so when I return I can continue work with out the loss of all my important datasets.
Thank you Pedro & dick scherrer
For the record:
I think I will keep my original code.
Change the Exit 0 to Exit 4 in JERECALL.
Set option 2 as a default for the Log/List.
And this will satisfy my requirements.
Thank you all for your input =) |
|
Back to top |
|
|
dick scherrer
Moderator Emeritus
Joined: 23 Nov 2006 Posts: 19244 Location: Inside the Matrix
|
|
|
|
Hello,
Quote: |
so when I return I can continue work with out the loss of all my important datasets. |
Suggest you work with your storage management people and learn why any of your datasets are LOST. Archived maybe, but hopefully not Gone.
Possibly there is a way for your "keeper" datasets to be placed in a storage class where they will not be deleted, but archived. This too would be working with the storage magement people. |
|
Back to top |
|
|
Pedro
Global Moderator
Joined: 01 Sep 2006 Posts: 2547 Location: Silicon Valley
|
|
|
|
Quote: |
It would be a pain if someone had to press enter every screen |
You need to use the VOLUME parameter of the LISTCAT command. If the volume is MIGRAT, do not issue the recall. |
|
Back to top |
|
|
daveporcelan
Active Member
Joined: 01 Dec 2006 Posts: 792 Location: Pennsylvania
|
|
|
|
Quote: |
At our site, our datasets vanish after a few weeks. I am mainly writing this REXX to recall my datasets when I go on leave for a month+. I will ask someone to add this to their log on, so when I return I can continue work with out the loss of all my important datasets.
|
Could you simply issue an HBACK on your 'important' datasets before you leave,
Then issue an HRECOVER for those that are gone (or all of them) when you return?
No need to mess with them every day.
Just a thought. |
|
Back to top |
|
|
James Emerson
New User
Joined: 26 Mar 2009 Posts: 5 Location: Brisbane
|
|
|
|
Hi again, here is my new solution using LISTCAT VOLUME. I have gutted out the extra code just to show the basic flow of it so people can see it. Thank you Pedro, now I dont need to use ISPSTART which is great.
Code: |
/* YOU CAN CALL FROM MYLOGON VIA: */
/* - "%JERECALL USERID" */
*** JERECALL REXX***
ADDRESS TSO
PARSE UPPER ARG UID DIS
DSN = UID || '.*'
X = OUTTRAP('VAR.')
"LISTCAT VOLUME"
RECALL_COUNT = 0
START_RECALL = 'N'
DO I = 1 TO VAR.0
VAR = STRIP(VAR.I)
IF POS(UID,VAR) > 0 THEN DS = 'Y'
ELSE DS = 'N'
/* SKIM THE ARRAY FOR THE FIRST DATASET TO CHECK */
SELECT
WHEN START_RECALL = 'N' & DS = 'Y' THEN START_RECALL = 'Y'
WHEN START_RECALL = 'N' THEN ITERATE
OTHERWISE NOP
END /* SELECT */
/* THE ARRAY CONTAINS 3 LINES FOR EACH DATASET WHICH LOOK LIKE: */
/* - DATASET NAME : "DATASET" */
/* - OPTION TYPE : " --VOLUMES--" */
/* - VOLUME STATUS: " MIGRAT " */
TEXT = STRIP(VAR.I)
SELECT
WHEN DS = 'Y' THEN DSN = "'" || TEXT || "'"
WHEN POS(TEXT,'--VOLUMES--') > 0 THEN NOP
OTHERWISE IF POS(TEXT,'MIGRAT') THEN "HRECALL" DSN "NOWAIT"
END /* SELECT */
END /* DO I */
/* TURN TRAPPING OFF */
X = OUTTRAP('OFF')
EXIT 0 |
Thank you. |
|
Back to top |
|
|
|