SAS Monitor - Source Code


AGREEMENT

Copyright (c) 1997 Meta-Xceed, Inc.
Fremont, CA 94555
all rights reserved

THE INFORMATION CONTAINED ON THIS FILE IS PROVIDED BY META-XCCED, INC. "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. RECIPIENTS ACKNOWLEDGE AND AGREE THAT THE META-XCEED, INC. SHALL NOT BE LIABLE WHATSOEVER FOR ANY DAMAGES ARISING OUT OF THEIR USE OF THIS INFORMATION.

The following programs were scheduled to run every 10 minutes via the crontab facility.


*-------------------------------------------------------------*;
* program:     ls_ps.sas                                      *;
* Description: Compare the process information with the work  *;
*              space and generate a report which show those   *;
*              work space with no process.                    *;
* By:          Sy Truong, 10/10/97                            *;
*-------------------------------------------------------------*;
 
libname sasin '.';

*** Collect information for SAS processes ***;
filename psetenv pipe "/usr/ucb/ps -uaw | grep :";
options linesize=162;
 
*** Parse UNIX process information ***;
data sasin.ps_uaw;
   length user $8 pid $5 cpu $4 mem $4 sz $5
   start $8 time $4 command $100;
 
   * Read STDOUT from UNIX command *;
   infile psetenv lrecl=162  missover pad;
 
   * Input whole STDOUT line *;
   input user $1-8 pid $10-15 cpu $16-20
         mem $21-25 sz $25-30 start $47-55
         time $56-60 command $62-162;
 
   if command ne "<defunct>" then do;
      * compute a new date *;
      curdate = input("&sysdate",date7.);
      year1 = put(year(curdate),$4.);
      year2 = substr(year1,3,2);

      *** Check to see if it is a date ***;
      if index(start,":") then do;
         sdate = input("&sysdate",date7.);
         stime = input(start,time8.);
      end;
      else do;
         sdate = input(compress(substr(start,4) || substr(start,1,3) || year2),date7.);
         *** Approximate the time ***;
         stime = input("12:00",time5.);

      end;

      ndate = input("&sysdate",date7.);
      ntime = input("&systime",time5.);
 
      durday = ndate - sdate;
      durtime = ntime - stime;

      *** Round off time if it has just happened ***;
      if durtime < 0 then durtime = 0;

 
      format sdate date7. stime durtime time5. ;

      * check to see if it is sas *;
      if index(command,"sas")  > 0 or
         index(command,"ssub") > 0 then output;
   end;
run;

*** Collect information for work spaces ***;
filename psetenv pipe "/usr/ucb/ls -al /sastmp | grep SAS_work";
options linesize=162 macrogen;
 
data sasin.ls;
   length filesys $25 link 8  user $8
          size 8 month $3 day $2  time $5 direct $20 ;
 
   * Read STDOUT from UNIX command *;
   infile psetenv lrecl=162  missover pad;
 
   * Input whole STDOUT line *;
   input filesys link user size month day time direct ;
 
   * compute a new date *;
   curdate = input("&sysdate",date7.);
   year = year(curdate);
   date = input(compress(day||month||year),date9.);
   format date date7.;
run;
 
*** Remove sessions which are editing files ***;
data ps;
   set sasin.ps_uaw;
   if index(command,"vi ") > 0 or              
      index(command,"/opt/tpu4.1/nu_tpu/solaris/tpu_v41") > 0 then delete;

run;

proc sort data = sasin.ls (keep = user date direct) 
   out = ls;
   by user date;
run;


proc sort data = ps (keep = user sdate command 
   rename = (sdate=date))
   out = ps;
   by user date;
run;


data analysis (keep = direct);
   merge ps (in=ps) 
         ls (in=ls);
   by user date;

   if (ls) and not(ps) then output;
run;


*** Merged found work with original list ***;
proc sort data = sasin.ls out=ls;
   by direct;
run;

proc sort data=analysis;
   by direct;
run;

data new ;
   merge ls (in=ls) analysis (in=an);
   by direct;

   if (an) then output;
run;
 

*** Generate an report of those that have work directories but no process ***;
filename outhtm "ls_ps.html";

proc sort data = work.new out=work.sorted;
   by date time;
run;
 
*** Create HTML page from results ***;
data _null_;
   file outhtm;
   set work.sorted end=eof;
   by date time;
 
   tc1 = "  <TH BGCOLOR=silver ALIGN=CENTER VALIGN=MIDDLE><font size=2>";
   _tc1 = "  </TH>   ";
 
   retain count 0;
   count = count + 1;
 
   *** Create HTML header ***;
   if count = 1 then do;
      put
      // "<HTML>"
      / "<HEAD>"
      / '   <META    NAME="SAS Monitor Generated"'
      / '   CONTENT="SAS Monitor Tool by Sy Truong">'
      / "   <TITLE>SAS Monitor - Work Space with no Process </TITLE>"
      / "</HEAD>"
      / "<BODY BGCOLOR=white>"
      / '<h2 align="center"> Work Space With No Process</h2>'
      / '<div align="center"><center>'
      / '<TABLE BORDER=1 WIDTH=175 ALIGN=CENTER CELLPADDING=4'
      / 'CELLSPACING=1 BGCOLOR=white>'
      / '<TR>'
      / tc1 'User'  _tc1
      / tc1 'Size (bytes)'  _tc1
      / tc1 'Date'  _tc1
      / tc1 'Time' _tc1
      / tc1 'Directory' _tc1
      / '</TR>'
      ;
   end;
 
   tc2 = "<TD><font size=2>";
   tc2c = "<TD ALIGN=CENTER><font size=2>";
   tc2rc = '<TD ALIGN=CENTER bgcolor="#FF8080"><font color="#FF0000" size=2>';
   tc2rl = '<TD bgcolor="#FF8080"><font color="#FF0000" size=2>';
   _tc2 = "</TD>";
 
   *** Create body of table ***;
   put / '<TR>'
      / tc2  user  _tc2
      / tc2  size  _tc2
      / tc2  date date7.  _tc2
      / tc2  time _tc2
      / tc2  direct  _tc2
    ;
 
 
    **** Create the HTML Footer ***;
   if (eof) then do;
      put
         / "</TABLE>"
         / '<p>&nbsp;</p>'
         / '</center></div>'
         / '<hr width="50%">'
         / '<p align="center"><font size="2"><em>SAS Monitor, Last Modified: '
           " &sysdate &systime"
         / "</BODY>"
         / "</HTML>"
      ;
   end;
 
run;
 
x "rcp ls_ps.html webserver:/path/sasmon/ls_ps.html";

*-------------------------------------------------------------*;
* program:     df.sas                                         *;
* Description: This program captures and displays the amount  *;
*              of disk space occupied by file systems         *;
*              pertaining to SAS.                             *;
* By:          Sy Truong, 10/10/97                            *;
*-------------------------------------------------------------*;

*** Capture information from UNIX command ***;
filename psetenv pipe "/usr/ucb/df | grep sas";
options linesize=162;

libname sasin '.';

*** Parase information from UNIX ***;
data sasin.df ;
   length filesys $25 kbytes 8  used 8  
          avail 8 capacity $4 volume $12; 

   * Read STDOUT from UNIX command *;
   infile psetenv lrecl=162  missover pad;

   * Input whole STDOUT line *;
   input filesys kbytes used avail capacity volume; 

   * format the capacity to a numeric value *;
   ncapa = input(substr(capacity,1,length(capacity)-1),8.);

run;

*** Create the Graph ***;
filename outgif './df.gif'; 

goptions reset    = all
         ftext    = swissb
         htext    = 2.3 
         colors   = (black)
         cback    = white
         gunit    = pct
         gsflen   = 132
         gsfmode  = replace
         gsfname  = outgif 
         device   = imggif 
         display
         noprompt
         gaccess  = gsasfile
         gend     = '0a'x
         hsize    = 6.5 in
         vsize    = 5.0 in
         hpos=45
         vpos=75
         ;
 

options pagesize=48
        linesize=150
        nonumber
        nodate
        nosource2;
 
************************************************************
*  Set up formats for titles, footnotes, plot symbols, etc.*
************************************************************;
title1 f = swissb
       h = 4.0
       j = center "SAS Related Disk Volume Usage";
 
title2 f = swissb h = 3.0 j=c 'rosie.gene.com' ;
footnote1 f = swissb
          h = 2.0
          j = l "Generated &sysdate &systime"
          j = r "SAS/Monitor by Sy Truong" ;
 
pattern1 value = S color =blue;
pattern2 value = S color =red;
pattern3 value = S color =yellow;
 
axis1 label=none value=none;
 
legend frame across = 1 label = none;


proc gchart data = sasin.df;
     vbar ncapa / discrete
                   maxis    = axis1
                   raxis    = 0 to 100 by 5
                   group    = volume 
                   minor    = 0
                   width    = 2 
                   nozero
                   sumvar   = ncapa 
                   legend   = legend
                   coutline = black
                   sum;
     label ncapa = 'Capacity (%)'
           volume  = 'Disk Volume';
run ;
 
x 'rcp df.gif webserver:/path/sasmon/df.gif';


*** Generate the HTML file which uses the GIF images ***;
filename outhtm './df.html';

*** Create HTML page from results ***;
data _null_;
   file outhtm;
   set sasin.df end=eof;
 
   tc1 = "  <TH BGCOLOR=silver ALIGN=CENTER VALIGN=MIDDLE><font size=2>";
   _tc1 = "  </TH>   ";
 
   retain count 0;
   count = count + 1;
 
   *** Create HTML header ***;
   if count = 1 then do;
      put
      // "<HTML>"
      / "<HEAD>"
      / '   <META    NAME="SAS Monitor Generated"'
      / '   CONTENT="SAS Monitor Tool by Sy Truong">'
      / "   <TITLE>SAS Monitor - Disk Usage </TITLE>"
      / "</HEAD>"
      / "<BODY BGCOLOR=white>"
      / '<h2 align="center"> Disk and Swap Space Usage </h2>'
      / '<div align="center"><center>'
      / '<TABLE BORDER=1 WIDTH=175 ALIGN=CENTER CELLPADDING=1 CELLSPACING=1 BGCOLOR=white>'
      / '<TR>'
      / tc1 'File System'  _tc1
      / tc1 'Kbytes'  _tc1
      / tc1 'Used'  _tc1
      / tc1 'Available' _tc1
      / tc1 'Capacity (%)' _tc1
      / tc1 'Disk Volume' _tc1
      / '</TR>'
      ;
   end;

   tc2 = "<TD><font size=2>";
   tc2c = "<TD ALIGN=CENTER><font size=2>";
   tc2rc = '<TD ALIGN=CENTER bgcolor="#FF8080"><font color="#FF0000" size=2>';
   tc2rl = '<TD bgcolor="#FF8080"><font color="#FF0000" size=2>';
   _tc2 = "</TD>";

   *** Create body of table ***;
   put / '<TR>'
      / tc2  filesys  _tc2
      / tc2  kbytes  _tc2
      / tc2  used  _tc2
      / tc2  avail _tc2 
      / tc2c  capacity _tc2
      / tc2  volume _tc2
    ;


    **** Create the HTML Footer ***;
   if (eof) then do;
      put
         / "</TABLE>"
         / '<p>&nbsp;</p>'
         / '<TABLE BORDER=1 WIDTH=175 ALIGN=CENTER CELLPADDING=1'
         / ' CELLSPACING=1 BGCOLOR=white>'
         / '<TR>'
         / '<td><p align="center"> <img src="./df.gif"> </p></td>'
         / '</TR>'
         / '</TABLE>'
         / '<p>&nbsp;</p>'
         / '<hr width="50%">'
         / '<p align="center"><font size="2"><em>SAS Monitor, Last Modified: '
           " &sysdate &systime"
         / '</center></div>'
         / "</BODY>"
         / "</HTML>"
      ;
   end;
 
run;

x 'rcp df.html webserver:/path/sasmon/df.html';

*-------------------------------------------------------------*;
* program:     ls.sas                                         *;
* Description: Generates a list of files which are in the     *;
*              work space.  Produce HTML files sorted by      *;
*              User and Date.                                 *;
* By:          Sy Truong, 10/10/97                            *;
*-------------------------------------------------------------*;

*** Define UNIX command which captures file in work area ***;
filename psetenv pipe "/usr/ucb/ls -al /sastmp | grep SAS_work";
options linesize=162 macrogen;

*** Parse the information from UNIX command ***; 
data work.ls;
   length filesys $25 link 8  user $8
          size 8 month $3 day $2  time $5 direct $20 ;

   * Read STDOUT from UNIX command *;
   infile psetenv lrecl=162  missover pad;

   * Input whole STDOUT line *;
   input filesys link user size month day time direct ;

   * compute a new date *;
   curdate = input("&sysdate",date7.);
   year = year(curdate);
   date = input(compress(day||month||year),date9.);
   format date date7.;
run;

*** Define the macro the Generate HTML files ***;
%macro htmlgen (outfile,sortord,descend,link,link2);

*** Generate the HTML file reporting resuls***;
filename outhtm "&outfile";

proc sort data = work.ls out=work.sorted;
   by &descend &sortord;
run;

*** Create HTML page from results ***;
data _null_;
   file outhtm;
   set work.sorted end=eof;
   by &descend &sortord;

   tc1 = "  <TH BGCOLOR=silver ALIGN=CENTER VALIGN=MIDDLE><font size=2>";
   _tc1 = "  </TH>   ";

   retain count 0;
   count = count + 1;

   *** Create HTML header ***;
   if count = 1 then do;
      put
      // "<HTML>"
      / "<HEAD>"
      / '   <META    NAME="SAS Monitor Generated"'
      / '   CONTENT="SAS Monitor Tool by Sy Truong">'
      / "   <TITLE>SAS Monitor - /sastmp Files </TITLE>"
      / "</HEAD>"
      / "<BODY BGCOLOR=white>"
      / '<h2 align="center">Work Space (/sastmp) Listing </h2>'
      / '<div align="center"><center>'
      / '<TABLE BORDER=1 WIDTH=175 ALIGN=CENTER CELLPADDING=4'
      / 'CELLSPACING=1 BGCOLOR=white>'
      / '<TR>'
      / tc1 &link2 'User'  _tc1
      / tc1 'Size (bytes)'  _tc1
      / tc1 &link 'Date'  _tc1
      / tc1 'Time' _tc1
      / tc1 'Directory' _tc1
      / '</TR>'
      ;
   end;

   tc2 = "<TD><font size=2>";
   tc2c = "<TD ALIGN=CENTER><font size=2>";
   tc2rc = '<TD ALIGN=CENTER bgcolor="#FF8080"><font color="#FF0000" size=2>';
   tc2rl = '<TD bgcolor="#FF8080"><font color="#FF0000" size=2>';
   _tc2 = "</TD>";

   *** Create body of table ***;
   put / '<TR>'
      / tc2  user  _tc2
      / tc2  size  _tc2
      / tc2  date date7.  _tc2
      / tc2  time _tc2
      / tc2  direct  _tc2
    ;


    **** Create the HTML Footer ***;
   if (eof) then do;
      put
         / "</TABLE>"
         / '<p>&nbsp;</p>'
         / '</center></div>'
         / '<hr width="50%">' 
         / '<p align="center"><font size="2"><em>SAS Monitor, Last Modified: '
           " &sysdate &systime" 
         / "</BODY>"
         / "</HTML>"
      ;
   end;

run;

*** Copy HTML output produced to webserver ***;
x "rcp &outfile webserver:/path/sasmon/&outfile";


%mend htmlgen;

*** Invoke macro to produce HTML files with different sort orders ***; 
%htmlgen(ls_time1.html,date time, ,'<a href="ls_time2.html">','<a href="ls_user1.html">');
%htmlgen(ls_time2.html,date time,descending,'<a href="ls_time1.html">','<a href="ls_user1.html">');
%htmlgen(ls_user1.html,user date time, ,'<a href="ls_time1.html">','<a href="ls_user2.html">');
%htmlgen(ls_user2.html,user date time,descending,'<a href="ls_time1.html">','<a href="ls_user1.html">');


*-------------------------------------------------------------*;
* program:     ps.sas                                         *;
* Description: Display all UNIX processes which pertain to    *;
*              SAS.  Generate reports which are sorted by     *;
*              user and start date.                           *;
* By:          Sy Truong, 10/10/97                            *;
*-------------------------------------------------------------*;

*** Define UNIX command to capture UNIX process information ***;
filename psetenv pipe "/usr/ucb/ps -uaw";
options linesize=162;
 
*** Parse the information from the UNIX command ***;
data work.ps_uaw;
   length user $8 pid $5 cpu $4 mem $4 sz $5
   start $8 time $4 command $100;
 
   * Read STDOUT from UNIX command *;
   infile psetenv lrecl=162  missover pad;
 
   * Input whole STDOUT line *;
   input user $1-8 pid $10-15 cpu $16-20
         mem $21-25 sz $25-30 start $47-55
         time $56-60 command $62-162;
 
 
   * check to see if it is sas *;
   if index(command,"sas")  > 0 or
      index(command,"ssub") > 0 then output;
run;

*** Store this information in physical file for future usage ***;
libname sasin '.';

data ps_uaw;
   set sasin.ps_uaw;
run;


data work.duration;
   set sasin.ps_uaw;
run;


*** Define the macro the Generate HTML files ***;
%macro htmlgen (outfile,sortord,descend,link1,link2);
 
proc sort data = work.duration out = odur
   (keep = user pid sdate stime durday durtime command);
   by &descend &sortord;
run;


*** Generate the HTML from data set ***;
title "SAS Related Process Ordered by Duration";


*** Generate the HTML file reporting resuls***;
filename outhtm "&outfile";

*** Create HTML page from results ***;
data _null_;
   file outhtm;
   set work.odur end=eof;

   tc1 = "  <TH BGCOLOR=silver ALIGN=CENTER VALIGN=MIDDLE><font size=2>";
   _tc1 = "  </TH>   ";

   retain count 0;
   count = count + 1;

   *** Create HTML header ***;
   if count = 1 then do;
      put
      // "<HTML>"
      / "<HEAD>"
      / '   <META    NAME="SAS Monitor Generated"'
      / '   CONTENT="SAS Monitor Tool by Sy Truong">'
      / "   <TITLE>SAS Monitor - Duration </TITLE>"
      / "</HEAD>"
      / "<BODY BGCOLOR=white>"
      / '<h2 align="center"> SAS Processes</h2>'
      / '<TABLE BORDER=1 WIDTH=175 ALIGN=CENTER CELLPADDING=1 CELLSPACING=1 BGCOLOR=white>'
      / '<TR>'
      / tc1 &link2 'User' _tc1
      / tc1 " Process ID" _tc1
      / tc1 &link1 'Start Date' _tc1
      / tc1 " Start Time" _tc1
      / tc1 " Duration (Day)" _tc1
      / tc1 " Duration (Time)" _tc1
      / tc1 " Command"  _tc1
      / '</TR>'
      ;
   end;

   tc2 = "<TD><font size=2>";
   tc2c = "<TD ALIGN=CENTER><font size=2>";
   tc2rc = '<TD ALIGN=CENTER bgcolor="#FF8080"><font color="#FF0000" size=2>';
   tc2rl = '<TD bgcolor="#FF8080"><font color="#FF0000" size=2>';
   _tc2 = "</TD>";

   *** Create body of table ***;
   put / '<TR>'
      / tc2  user _tc2
      / tc2  pid  _tc2
      / tc2  sdate  _tc2
      / tc2  stime _tc2 ;

   if (durday > 1) then 
      put tc2rc durday _tc2;
   else put tc2c durday _tc2;

      put
      / tc2c durtime  _tc2
      / tc2  command _tc2
      / '</TR>'
   ;


    **** Create the HTML Footer ***;
   if (eof) then do;
      put
         / "</TABLE>"
         / '<p>&nbsp;</p>'
         / '<hr width="50%">'
         / '<p align="center"><font size="2"><em>SAS Monitor, Last Modified: '
           " &sysdate &systime"
         / "</BODY>"
         / "</HTML>"
      ;
   end;

run;

*** Copy created files over to Web server ***;
x "rcp &outfile webserver:/path/sasmon/&outfile";

%mend htmlgen;

*** Invoke macro to generate files in various sort order ***;
%htmlgen(ps_time1.html,sdate stime pid, ,'<a href="ps_time2.html">', '<a href="ps_user1.html">');
%htmlgen(ps_time2.html,sdate stime pid, descending , '<a href="ps_time1.html">', '<a href="ps_user1.html">');
%htmlgen(ps_user1.html,user sdate stime ,  , '<a href="ps_time1.html">', '<a href="ps_user2.html">');
%htmlgen(ps_user2.html,user sdate stime , descending , '<a href="ps_time1.html">', '<a href="ps_user1.html">');

*-------------------------------------------------------------*;
* program:     uptime.sas                                     *;
* Description: This program captures: the  length  of time    *; 
*              the system has been up, and the average number *;
*              of jobs in the run queue over the last 1, 5    *;
*              in the run queue over the last 1, 5 and 15     *;
*              minutes. It produces an HTML report of this    *;
*              information graphically and textually.         *; 
* By:          Sy Truong, 10/10/97                            *;
*-------------------------------------------------------------*;

*** Issue UNIX command to gather information ***;
filename psetenv pipe "/usr/bin/uname -a";
options linesize=162;
 
*** Parse the information ***;
data work.uname ;
   length os $5 node $14 release $3 osver $17 hardwr $5 proctp $5; 
 
   * Read STDOUT from UNIX command *;
   infile psetenv lrecl=162  missover pad;
 
   * Input whole STDOUT line *;
   input os node release osver hardwr proctp;
run;


filename psetenv pipe "/usr/ucb/uptime ";
options linesize=162;

data work.uptime ;
   length curtime $7  updays $9 uptime $5  usern $8 
          load1 $4 load5 $4 load15 $4;   

   * Read STDOUT from UNIX command *;
   infile psetenv lrecl=162  missover pad;

   * Input whole STDOUT line *;
   input curtime $3-9 updays $14-23 uptime $25-30  usern $33-41 
         load1 $58-62 load5 $64-68  load15 $70-74; 

run;
 
data all;
   set uname uptime;
run;
 
options ls= 100;
proc print;
run;

*** Transform the numbers for graphs ***;
data uptime;
   set uptime;

   length nload1 nload5 nload15 8 time 8;

   nload1 = input(load1,8.);
   nload5 = input(load5,8.);
   nload15 = input(load15,8.);
   
   time = 1;
   load = nload1;
   output;

   time = 5;
   load = nload5;
   output;

   time = 15;
   load = nload15;
   output;

run;

*** Create the Graph ***;
filename outgif 'uptime.gif'; 

goptions reset    = all
         ftext    = swissb
         htext    = 2.3 
         colors   = (black)
         cback    = white
         gunit    = pct
         gsflen   = 132
         gsfmode  = replace
         gsfname  = outgif 
         device   = imggif 
         display
         noprompt
         gaccess  = gsasfile
         gend     = '0a'x
         hsize    = 6.0 in
         vsize    = 5.0 in
         hpos=45
         vpos=75
         ;
 

options pagesize=48
        linesize=150
        nonumber
        nodate
        nosource2;
 
************************************************************
*  Set up formats for titles, footnotes, plot symbols, etc.*
************************************************************;
title1 f = swissb
       h = 4.0
       j = center "System Load Over Last 15 Minutes";
 
title2 f = swissb h = 3.0 j=c 'Rosie.gene.com' ;
footnote1 f = swissb
          h = 2.0
          j = l "Generated &sysdate &systime"
          j = r "SAS/Monitor by Sy Truong" ;
 
pattern1 value = S color =blue;
pattern2 value = S color =red;
pattern3 value = S color =yellow;
 
axis1 label=none value=none;
 
legend frame across = 1 label = none;


proc gchart data = uptime;
     vbar load / discrete
                   maxis    = axis1
                   raxis    = 0 to 20 by 2 
                   group    = time 
                   width    = 2
                   nozero
                   sumvar   = load 
                   legend   = legend
                   coutline = black
                   sum;
     label load = 'Average Job Load'
           time  = 'Within Last Minutes';
run ;
 
x 'rcp uptime.gif webserver:/path/sasmon/uptime.gif';
 

*** Generate the HTML file which uses the GIF images ***;
filename outhtm './uptime.html';

*** Create HTML page from results ***;
data _null_;
   file outhtm;
   set  work.all end=eof;
 
   tc1 = "  <TH BGCOLOR=silver ALIGN=CENTER VALIGN=MIDDLE><font size=2>";
   _tc1 = "  </TH>   ";
 
   retain count 0;
   count = count + 1;
 
   *** Create HTML header ***;
   if count = 1 then do;
      put
      // "<HTML>"
      / "<HEAD>"
      / '   <META    NAME="SAS Monitor Generated"'
      / '   CONTENT="SAS Monitor Tool by Sy Truong">'
      / "   <TITLE>SAS Monitor - System Load </TITLE>"
      / "</HEAD>"
      / "<BODY BGCOLOR=white>"
      / '<h2 align="center"> System Load </h2>'
      / '<div align="center"><center>';
   end;

   tc2 = "<TD><font size=2>";
   tc2c = "<TD ALIGN=CENTER><font size=2>";
   tc2rc = '<TD ALIGN=CENTER bgcolor="#FF8080"><font color="#FF0000" size=2>';
   tc2rl = '<TD bgcolor="#FF8080"><font color="#FF0000" size=2>';
   _tc2 = "</TD>";

   *** Create the table containing uname information ***;
   if os ne ' ' then do;
      put
      / '<TABLE BORDER=1 WIDTH=175 ALIGN=CENTER CELLPADDING=1 CELLSPACING=1 BGCOLOR=white>'
      / '<TR>'
      / tc1 'Operating System'  _tc1
      / tc1 'Node Name'  _tc1
      / tc1 'OS Release'  _tc1
      / tc1 'OS Version' _tc1
      / tc1 'Hardware Name' _tc1
      / tc1 'Processor Type' _tc1
      / '</TR>'
      / '<TR>'
      / tc2c os _tc2
      / tc2c node _tc2
      / tc2c release _tc2
      / tc2c osver _tc2
      / tc2c hardwr _tc2
      / tc2c proctp _tc2
      / "</TABLE>"
      / '<p>&nbsp;</p>'
      ;
   end;

   *** Create table for uptime information ***;
   if curtime ne ' ' then do;
      put
      / '<TABLE BORDER=1 WIDTH=175 ALIGN=CENTER CELLPADDING=1 CELLSPACING=1 BGCOLOR=white>'
      / '<TR>'
      / tc1 'Current Time'  _tc1
      / tc1 'Number of Days System Has Been Up' _tc1
      / tc1 'Lenth of Time System Has Been Up'  _tc1
      / tc1 'Number of Users' _tc1
      / tc1 'Average Number of Jobs In Queue Over Last 1 Minute' _tc1
      / tc1 'Average Number of Jobs In Queue Over Last 5 Minutes' _tc1
      / tc1 'Average Number of Jobs In Queue Over Last 15 Minutes' _tc1
      / '</TR>'
      / '<TR>'
      / tc2c curtime _tc2
      / tc2c updays _tc2
      / tc2c uptime _tc2
      / tc2c usern _tc2
      / tc2c load1 _tc2
      / tc2c load5 _tc2
      / tc2c load15 _tc2
      / "</TABLE>"
      / '<p>&nbsp;</p>'
      ;
   end;

   **** Create the HTML Footer ***;
   if (eof) then do;
      put
         / '<TABLE BORDER=1 WIDTH=175 ALIGN=CENTER CELLPADDING=4'
         / ' CELLSPACING=1 BGCOLOR=white>'
         / '<TR>'
         / '<td><p align="center"> <img src="./uptime.gif"> </p></td>'
         / '</TR>'
         / '</TABLE>'
         / '</center></div>'
         / '<p>&nbsp;</p>'
         / '<hr width="50%">'
         / '<p align="center"><font size="2"><em>SAS Monitor, Last Modified: '
           " &sysdate &systime"
         / "</BODY>"
         / "</HTML>"
      ;
   end;
 
run;

x 'rcp uptime.html webserver:/path/sasmon/uptime.html';