by Jeff Vance, CSY
Enhancements summary:
There are three new CI evaluator functions - JINFO, JOBCNT and WORDCNT.
There are five new CI variables - HPDATETIME, HPDOY, HPHHMMSSMMM, HPLEAPYEAR, HPYYYYMMDD.
The PAUSE command allows you to select just jobs or just sessions that match "[jobname,]user.account".
The QUOTE function, introduced late in release 5.5, has been officially removed. It was un-documented in the 6.0 base release and the function has been deleted in 6.0 Express 1. QUOTE was removed because it did not provide useful functionality, and is easy to duplicate using the existing REPL function.
The DELIMPOS function returns the position (index) of one or more specified delimiters. A defect in DELIMPOS was corrected which could impact some existing CI scripts. Prior to 6.0 express 1, DELIMPOS treated each space in the string as a separate delimiter -- in other words, there was no 'folding' of spaces. In 6.0 express 1, DELIMPOS treats multiple spaces as a single delimiter, just as the WORD function does. In fact, DELIMPOS is consistent with WORD's "endvar" parameter for all cases, except when the string has no matching delimiter. In this situation DELIMPOS returns 0, meaning there was no match; whereas, WORD returns string length plus one.
Jinfo
Syntax: JINFO ( jobID, item [,status] )
jobID Required. String identifying the target job or session that information is being requested for. Format is "[#]J|Snnn", or "0", indicating the current job or session..
item Required. String label specifying the information requested for the target job or session. Only one item can be requested per call to JINFO, although some of the items below return multiple pieces of information.
status Optional. An unquoted CI variable name to hold the integer status value for JINFO. If passed, the variable named by this argument contains the status of the call to jinfo: zero indicates success, non-zero indicates a failure. When 'status' is passed and an error occurs, the CI ignores the error. Specifically, no message is written to $STDLIST or to $STDERR, and the CIERROR variable is not set. The JINFO function return is always -1 when 'status' is specified and a JINFO error occurs. If this argument is omitted and an error in JINFO occurs, a CI error message is written to $STDLIST (within the definition of the HPMSGFENCE variable).
status values: 0 - success 3042 - no job or session matches the jobID 4000 - invalid syntax for the jobID, expect [#]J|Snnn 9942 - unknown JINFO item 9945 - information for the requested item is unavailable for the target jobID 9946 - item security violation, the user needs greater privileges to retrieve the item
Example: :calc JINFO('S64','IPaddr') Result: 15.192.90.81 Example: :calc JINFO('J144','FmtPriority',status) Result: DQ Example: setvar _state JINFO(hplastjob,'jobstate',status) while status = 0 and _state = 'WAIT' do pause 20 ... setvar _state JINFO(hplastjob,'jobstate',status) endwhile Example: if jobcnt('@J:@r.sys',jlist) > 0 then setvar i 0 setvar total_cpu 0 while setvar(_job, word(jlist,,setvar(i,i+1))) <> '' do if JINFO(_job,'exists') then setvar total_cpu total_cpu + JINFO(_job,'CPUsec') endif endwhile endif
Restrictions
Not all items listed below are available to jobs that are waiting or scheduled. For example, JINFO is unable to return the CI PIN ('CIpin') if the job is waiting; however, some items, like the job state and job queue, are returned, regardless of the state of the target job. When a JINFO item cannot be obtained CIERR 9945 is reported. If the 'status' argument is passed, it is set to 9945 and no CI error is displayed.
No special capabilities are required to get any info about your own job/session. Users with OP or SM capability can get all items for any job/session, and may also retrieve the global items available via JINFO.
For users lacking OP or SM capability:
To access restricted data for a job logged on in the same "user.acct", AM capability is required, unless JOBSECURITY is set to LOW. If JOBSECURITY is LOW, JINFO considers the job as if it is "you".
To access restricted data for a job logged on in your account but as a different user, AM capability is required, independent of the JOBSECURITY setting.
Some items have additional restrictions:
'command', any token in the command image that could be considered a lockword is deleted.
Jinfo item values and descriptions
Label Type Description ------------- ------ --------------------------------------------------
Account string account name CIpin int PIN number for the job's usermain process, typically the CI Command string * command most recently executed (lockwords are removed) ConnectMin int number of minutes connected ConnectSec int number of seconds connected Copies int number of copies for $STDLIST output CPULimit int CPU limit in seconds, -1 is unlimited CPUMillsec int number of milliseconds of CPU CPUSec int number of seconds of CPU Deferred bool True if job's inpri is <= the jobfence DegradeMode bool *+ True if system is running in degraded mode, meaning no new jobs are allowed to log on until disk space is recovered Exist bool True if the target job exists in any state Exists bool See 'Exist' Executing bool ! True if the target job exists and is in the INTRO, EXEC* or EXEC states FmtIntroDate string formatted date job was introduced, eg. "WED, JUL 14, 1999" FmtIntroTime string formatted time job was introduced, eg. "6:21 PM" FmtPriority string current scheduling queue for the usermain (CI) process, e.g. 'BS', 'CS', 'DS', 'ES' FmtStreamedByDate string formatted date when job/session was submitted FmtStreamedByTime string formatted time when job/session was submitted Group string logon group name HomeGroup string * home group name Inpri int input priority IntIntroDate int date job was introduced as a YYYYMMDD integer IntIntroTime int time job was introduced as a HHMMSS integer IntroDate int see "IntIntroDate" IntroTime int see "IntIntroTime" IntStreamedByDate int date job/session was submitted as a YYYMMDD integer IntStreamedByTime int time job/session was submitted as a HHMMSS integer IPAddr string ** IP address in dotted format (xx.xx.xx.xx), '' for jobs and local sessions Job User Account string "[jname,]user.acct" names concatenated Job User Account string "[jname,]user.acct,group" names concatenated Group JobName string jobname if supplied, else "" JobNum string unique job identifier, "#J|Snnn" JobQ string job queue name, "" for sessions JobSecurity bool *+ 'LOW' or 'HIGH' depending on the JOBSECURITY setting JobState string "INTRO", "SCHED", "WAIT", "EXEC*", "EXEC", "SUSP" JobType string "J" for jobs and "S" for sessions JobUserAccount string see "Job User Account". JobUserAccountGroup string see "Job User Account Group" JSMAINPin int PIN number for the job's JSMAIN process LdevIn int Input LDEV number for $STDIN LdevOut int Output LDEV number for $STDLIST, 0 for spooled jobs LocAttr int * user local attributes Numbered bool True is job file is numbered Outclass string Outclass name for a job's STDLIST, e.g. "LP". Empty ("") for sessions Outpri int output priority PassExempt string *+ the system's password exemption policy for jobs: "NONE", "USER", "XACCESS", "MAX" Priority int current priority for the usermain (CI) process, e.g. 150, 200, etc. Private bool * True if the job's stdlist is marked private Quiet bool True if :set msg=off is in effect RawIntroDate int date job was introduced in CALENDAR format RawIntroTime int time job was introduced in CLOCK format RawStreamedByDate int date job/session was submitted in CALENDAR format RawStreamedByTime int time job/session was submitted in CLOCK format Restart bool True if ";RESTART" specified in job "card" Scheduled bool ! True if the target job exists and is in the SCHED state State string see "JobState" StdinSPID string "Innn" identifier for the stdin spoolfile for jobs StdinSPstate string STDIN spoolfile state: "OPEN", "ACTIVE", "READY". "" for sessions StdlistDelete bool True if SET STDLIST=delete in effect StdlistSPID string "Onnn" identifier for the stdlist spoolfile for jobs "" for sessions StdlistSPstate string STDLIST spoolfile state: "CREATE", "DEFER", "READY", "XFER", "PRINT", "PROBLM", "DELPND", "SPSAVE". Note: some of these states apply to jobs that have terminated. No JINFO information is available on jobs that have terminated StreamedBy string * full identifier of the job/session that streamed or initiated the target job. For example: "jobname,user.account (#J123)". This is the same value as seen in the HPSTREAMEDBY CI variable StreamedByDate int see "IntStreamedByDate" StreamedByLdev int * Ldev of job/session that submitted the target job StreamedByTime int see "IntStreamedByTime" Suspended bool ! True if the target job exists and is in the SCHED state User string user name User Account string "user.account" names concatenated User Account string "user.account,group" names concatenated Group UserAccount string See "User Account" UserAccountGroup string See "User Account Group" Waiting bool ! True if the target job exists and is in the WAIT state
* indicates you must have SM or OP capabilities, or the job must be your own job, or you must have AM capability and be logged on into the same account as the target job, or you must be logged on as the same user.account as the target job and JOBSECURITY is LOW. Otherwise, the item is not returned and an error is generated.
*+ indicates you must have SM or OP capabilities.
** indicates you must have one of SM,OP,NA,NM,PM capabilities.
! indicates a feature new to 7.0 express 1.
Jobcnt
Syntax: JOBCNT ( job_match [,joblist_var] )
Defn: A CI evaluator function that returns the number of jobs and/or sessions that match 'job_match'. Optionally, these matching job/session numbers are returned in the CI variable named by the 'joblist_var' parameter. All jobs/sessions matching "job_match" are counted, including: executing, waiting, suspended and scheduled jobs.
Type: Integer.
Parms Job_match: Required. String identifying the target jobs and/or sessions. Supported formats: "@" - all jobs and sessions "@J" - all jobs "@S" - all sessions "user.acct" - all job/sessions matching "user.acct" "jobname,user.acct" - all job/sessions matching "jobname,user.acct" "@J:[jobname,]user.acct" - all jobs-only matching "[jobname,]user.acct" "@S:[jobname,]user.acct" - all sessions-only matching "[jobname,]user.acct" Note: "jobname", "user" and "acct" may be wildcarded.
Note: ",user.acct" (empty 'jobname') can be passed to specify that only jobs or sessions without job names are desired. If 'jobname' is specified then only job/sessions with job names are considered.
Joblist_var: Optional. An unquoted name of a CI variable that holds the job/session numbers that match the 'job_match' argument. Each job/session number is separated by a single space. For example: "J2 S34 S36 J12 J31 S44" Note: it is possible that more jobs match than will fit in the CI variable. In this event, the variable is filled to capacity without reporting an error. The caller can detect this condition by comparing the number of jobs matching against the number of tokens in the 'joblist_var' variable.
Example: :calc JOBCNT("@S") # find all sessions Result: 12 Example: :calc JOBCNT("@J:@.sys") # find all jobs in SYS account Result: 4 Example: setvar x JOBCNT('@', jlist) # find all jobs/sessions if x <> wordcnt(jlist) then # not all matching job/sessions fit into var ... Example: :calc JOBCNT("@!hpjobtype:!hpjobname,!hpuser.!hpaccount") Result 1 # find all jobs or sessions logged # on exactly as "you" Wordcnt
Syntax: WORDCNT ( string[,delims][,start] )
Defn: A CI evaluator function that returns the number or words (tokens) defined by "delims" in "string", starting at "start". The default delimiters are the same as for the WORD and DELIMPOS functions: a space, a comma, a semicolon, an equals sign, left and right parentheses, left and right brackets, single quote, double quote, and tab. The default start is 1.
Type: Integer
Example: :calc WORDCNT('file a=bb,old;rec=40,,f,ascii') Result: 9
New CI variables
HPDATETIME A CI variable containing the current date and time in a string formatted as "YearMonthDateHourMinuteSecondMillisecond". For consistency, if HPDATETIME is referenced more than once for a "logical" (or atomic) operation, such as extracting the date and the time, it is very important to store HPDATETIME into a user-defined variable and extract from that variable. For example, to accurately separate the date and time from HPDATETIME the code below should *NOT* be used: setvar mydate lft(hpdatetime,8) /* Don't do this! */ setvar mytime rht(hpdatetime,9) /* Don't do this! */
The problem above is that "MYDATE" could be set a millisecond before midnight, and "MYTIME" could be set a millisecond past midnight, with the result being: MYDATE = 19990314 /* Mar 14 just before midnight */ MYTIME = 000000100 /* Mar 15 just past midnight */
Instead, create a variable that contains HPDATETIME and extract from that variable. For example: setvar date_time HPDATETIME /* This is correct! */ setvar mydate lft(date_time,8) setvar mytime rht(date_time,9)
Note: current time resolution is only tenths-of-a-second so the last two string characters will both be "0".
Type: String, read-only. Example: if the current date and time is Feb 21, 1999 at 14:08:15:2, HPDATETIME equals "19990221140815200"
HPDOY A CI variable containing the day number in the current year, with Jan. 1 being day 1. Type: Integer, read-only. Example: On Feb, 7, 1999 HPDOY equals: 38
HPHHMMSSMMM A CI variable containing the current time in a string formatted as "HourMinuteSecondMillisecond". Note: current resolution is only tenths-of-a-second so the last 2 string characters will both be "0". Type: String, read-only. Example: if the current time is 14:08:15:2, HPHHMMSSMMM equals "140815200"
HPLEAPYEAR A CI variable that indicates if the current year is a leap year. Type: Boolean, read-only. Example: On Feb. 7, 1999 HPLEAPYEAR equals: FALSE On Jan. 1, 2000 HPLEAPYEAR equals: TRUE
HPYYYYMMDD A CI variable containing the current date in a string formatted as "CenturyYear-of-centuryMonthDate". Type: String, read-only. Example: if the current date is Feb 21, 1999, HPYYYYMMDD equals "19990221"
Pause enhancement
PAUSE - The JOB= parameter of the PAUSE command now allows users to select jobs-only or sessions-only in the target user.account(s). A new "@J:" or "@S:" prefix to the existing "[jobname,]user.account" form supports this new functionality. The complete syntax for JOB= is: [#]J|Snnnn, where nnn is a number, or @S|@J|@ or [@J|@S:][jobname,]user.acct
The 'jobname' value can be passed as an null value (",") to indicate that only jobs or sessions without jobnames are considered. A non-null value in 'jobname' means that only jobs or session with job names are candidates for selection. If 'jobname' is not relevant to the selection then it should be omitted, and only the 'user.acct' should be specified.
To pause until all job/sessions logged on exactly as "you" (but excluding "you") terminate, enter:
:pause job="@!hpjobtype:!hpjobname,!hpuser.!hpaccount
|