Mostrando entradas con la etiqueta trucos. Mostrar todas las entradas
Mostrando entradas con la etiqueta trucos. Mostrar todas las entradas

miércoles, 21 de julio de 2021

Wayback Machine

A todos nos ha pasado buscar un artículo en internet y encontrar que el enlace esta roto.

Pues existe la web "Wayback Machine" que se dedica a realizar copias periódicas de las páginas web.

Si tenemos el enlace podemos probar de buscarlo y nos saldrá un calendario con las fechas en las que tiene copia del enlace.

Si la seleccionamos la hora del snapshot y esperamos unos segundos, aparecerá, como por arte de magia, la información que estamos buscando y aparentemente no podíamos recuperar:


Nota: No me hago responsable de que la información recuperada sea correcta, aunque si puede sea de gran ayuda ;o)




jueves, 25 de junio de 2020

Como crear ventana con una línea de mandatos

Cuando en un menú, o pantalla, programa queramos mostrar una ventana con la línea de mandatos, solo hemos de llamar a la API QUSCMDLN, y ya la tendremos integrada en nuestros menús y/o programas.

miércoles, 13 de febrero de 2019

Los misteriosos trabajos QP0ZSPWP


Articulo muy interesante de Dawn May, como todos los que escribe, en el IBM System Magazine, sobre los trabajos QP0ZSPWP.
Podeis leerlo en este enlace The Mysterious QP0ZSPWP Jobs.

viernes, 30 de septiembre de 2016

Expirar automaticamente los archivos de spool

Para que los archivos de spool antiguos se supriman automáticamente del sistema, podemos utilizar el mandato DLTEXPSPLF (desde V5R4), que inspecciona los spools de las colas de salida y elimina los que cumplan las condiciones de expiración.
Normalmente los archivos de spool se crean según los atributos de los archivos de impresora (*PRTF); para la caducidad del spool existen 4 parámetros, que se definen cuando se crea el archivo:

Campo           Texto                                                 Long Dec 
SPEXDT          0 = *NONE, 1 = Fecha, 2 = Días                          1      
SPXDCT          Siglo de la fecha de caducidad                          1      
SPXDAT          Fecha de caducidad de archivo: AAMMDD                   6      
SPXDAY          Días desde fecha creación hasta caducidad archivo       3    0 

Para un archivo de spool, generado desde un archivo de impresora, sin caducidad, veremos:
                   Trabajar con atributos de archivo en spool                   
 Trabajo  . . . . . . :   QP0ZSPWP        Archivo  . . . . . . :   QPJOBLOG     
   Usuario  . . . . . :     QPGMR         Número . . . . . . :     000001     
   Número . . . . . . :     049334        Fecha de creación  . :   26/09/15     
 Nombre sist trabajo  :   MYAS400         Hora de creación . . :   09:17:04   
.....  
Fecha de caducidad de archivo  . . . . :                

Para el mismo archivo de spool, generado desde un archivo de impresora, con caducidad 30 días, veremos:
                   Trabajar con atributos de archivo en spool                   
 Trabajo  . . . . . . :   QP0ZSPWP        Archivo  . . . . . . :   QPJOBLOG     
   Usuario  . . . . . :     QPGMR         Número . . . . . . :     000001     
   Número . . . . . . :     049334        Fecha de creación  . :   26/09/15     
 Nombre sist trabajo  :   MYAS400         Hora de creación . . :   09:17:04   
.....  
Fecha de caducidad de archivo  . . . . :   26/10/15  

Si queremos caducar un archivo de spool, solo hemos de cambiar los parámetros del archivo de spool:
  CHGSPLFA FILE(QPJOBLOG) EXPDATE(*DAYS) DAYS(30)

Para automatizar la gestión de spools por fecha de caducidad deberemos:

  1. Para modificar los archivos de impresora para que expiren a los 30 días de haberse creado, crearemos y ejecutaremos un programa CL, el codigo lo podeis bajar el código de esta utilidad del grupo Recursos AS400 en IBM developersWorks.
  2. Modificar, manualmente, los atributos de todos los archivos de spool, que ya existen en todas las colas de salida, con los parametros EXPDATE(*DAYS) y DAYS(30). Podemos omitir las colas QEZDEBUG y QEZJOBLOG, que se limpian automáticamente con las opciones de limpieza del sistema (GO CLEANUP), si las tenemos activadas.
  3. Planificar el trabajo (en ejemplo es semanal) que ejecuta la eliminación de los archivos de spool caducados:

     ADDJOBSCDE JOB(DLTEXPSPLF) CMD(DLTEXPSPLF) FRQ(*WEEKLY) 
     SCDDATE(*NONE) SCDDAY(*MON) SCDTIME(060000) 
     TEXT('Suprimir archivos de spool caducados')         


Nota1: Este procedimiento puede sustituir a la utilidad DLTOLDSPLF (http://www-01.ibm.com/support/docview.wss?uid=nas8N1019285).
Nota2: En los ejemplos se utiliza una expiración de 30 días, pero podría ser mas o menos días, según las necesidades              
Nota3: En el programa de ejemplo se modifican TODOS los archivos de impresora del sistema, que no tengan definida fecha de caducidad, si la tienen la respetan, ya que pueden existir archivos de impresora, y por tanto de spool, con otras necesidades de conservación en las colas.

Expirar automaticamente los archivos de spool

Para que los archivos de spool antiguos se supriman automáticamente del sistema, podemos utilizar el mandato DLTEXPSPLF (desde V5R4), que inspecciona los spools de las colas de salida y elimina los que cumplan las condiciones de expiración.
Normalmente los archivos de spool se crean según los atributos de los archivos de impresora (*PRTF); para la caducidad del spool existen 4 parámetros, que se definen cuando se crea el archivo:

Campo           Texto                                                 Long Dec 
SPEXDT          0 = *NONE, 1 = Fecha, 2 = Días                          1      
SPXDCT          Siglo de la fecha de caducidad                          1      
SPXDAT          Fecha de caducidad de archivo: AAMMDD                   6      
SPXDAY          Días desde fecha creación hasta caducidad archivo       3    0 

Para un archivo de spool, generado desde un archivo de impresora, sin caducidad, veremos:
                   Trabajar con atributos de archivo en spool                   
 Trabajo  . . . . . . :   QP0ZSPWP        Archivo  . . . . . . :   QPJOBLOG     
   Usuario  . . . . . :     QPGMR         Número . . . . . . :     000001     
   Número . . . . . . :     049334        Fecha de creación  . :   26/09/15     
 Nombre sist trabajo  :   MYAS400         Hora de creación . . :   09:17:04   
.....  
Fecha de caducidad de archivo  . . . . :                

Para el mismo archivo de spool, generado desde un archivo de impresora, con caducidad 30 días, veremos:
                   Trabajar con atributos de archivo en spool                   
 Trabajo  . . . . . . :   QP0ZSPWP        Archivo  . . . . . . :   QPJOBLOG     
   Usuario  . . . . . :     QPGMR         Número . . . . . . :     000001     
   Número . . . . . . :     049334        Fecha de creación  . :   26/09/15     
 Nombre sist trabajo  :   MYAS400         Hora de creación . . :   09:17:04   
.....  
Fecha de caducidad de archivo  . . . . :   26/10/15  

Si queremos caducar un archivo de spool, solo hemos de cambiar los parámetros del archivo de spool:
  CHGSPLFA FILE(QPJOBLOG) EXPDATE(*DAYS) DAYS(30)

Para automatizar la gestión de spools por fecha de expirarción deberemos:

  1. Para modificar los archivos de impresora para que expiren a los 30 días de haberse creado, crearemos y ejecutaremos un programa CL, el codigo lo podeis bajar de este enlace: (enlace en breve) 
  2. Modificar, manualmente, los atributos de todos los archivos de spool, que ya existen en todas las colas de salida, con los parametros EXPDATE(*DAYS) y DAYS(30). Podemos omitir las colas QEZDEBUG y QEZJOBLOG, que se limpian automáticamente con las opciones de limpieza del sistema (GO CLEANUP), si las tenemos activadas.
  3. Planificar el trabajo (en ejemplo es semanal) que ejecuta la eliminación de los archivos de spool caducados:

     ADDJOBSCDE JOB(DLTEXPSPLF) CMD(DLTEXPSPLF) FRQ(*WEEKLY) 
     SCDDATE(*NONE) SCDDAY(*MON) SCDTIME(060000) 
     TEXT('Suprimir archivos de spool caducados')         


Nota1: Este procedimiento puede sustituir a la utilidad DLTOLDSPLF (http://www-01.ibm.com/support/docview.wss?uid=nas8N1019285).
Nota2: En los ejemplos se utiliza una expiración de 30 días, pero podría ser mas o menos días, según las necesidades              
Nota3: En el programa de ejemplo se modifican TODOS los archivos de impresora del sistema, que no tengan definida fecha de caducidad, si la tienen la respetan, ya que pueden existir archivos de impresora, y por tanto de spool, con otras necesidades de conservación en las colas.

sábado, 16 de enero de 2016

Buenas practicas para la administración del sistema


En este articulo iré relacionando todos los consejos de practicas, que, creo deben usarse, y que,  a lo largo de los años, facilitarán la gestión de un sistema AS400.

No crear librerías que empiecen por Q
IBM denomina las bibliotecas, del sistema operativo y de sus productos (con alguna excepción), con la letra Q como caràcter inicial del nombre de biblioteca.
Si nosotros creamos bibliotecas que empiecen con esa letra, al realizar una copia de seguridad con el parámetro LIB(*ALLUSR), no se incluirán las bibliotecas Q*, excepto las bibliotecas QGPL, QUSRSYS, QPFRDATA y otras excepciones (ver ayuda mandato SAVLIB) . 
Por tanto no es una buena practica utilizar la letra Q como inicial de nuestras bibliotecas ya que si no las salvamos posteriormente no tendremos copia de las mismas.

No crear objetos en la biblioteca QSYS
No es una buena practica crear nuestros programas, ficheros, u otros objetos, en la biblioteca del sistema operativo, ni, en general, en otra biblioteca Q*, ya que afectaran a todas las aplicaciones que se ejecuten en el sistema y pueden provocarnos problemas en el futuro.

Crear la cola de mensajes QSYS/QSYSMSG
Esto es una función poco conocida del sistema operativo, al crear esta cola especial de mensajes se registraran en ella mensajes de gravedad que seguramente pasarían desapercibidos en la QSYSOPR, si hay muchos mensajes.

Activar la limpieza automàtica del sistema
Para mantener el espacio en disco a raya, una de las tareas que deben realizarse es la de limpiar logs y spools, periódicamente, para ello ver la entrada publicada: Limpiar automaticamente mensajes, joblogs, dumps, ...
También puede ser interesante borrar los archivos de spool de usuario antiguos, para ello podemos activar la fecha de expiración del archivo de spool (a partir V5R4) o planificar un trabajo con la utilidad DLTOLDSPLF, que podemos obtener en http://www-01.ibm.com/support/docview.wss?uid=nas8N1019285

Activar las estadísticas de espacio en disco
Para controlar el espacio en disco utilizado en el sistema podemos activar y planificar la tarea de recogida de uso del disco, el procedimiento esta explicado en la entrada Estadísticas de espacio en disco.
Es recomendable imprimir periodicamente la información de estas estadisticas, lo podemos, o tamien podemos utilizar la utilidad que publique para llevar un control más exhaustivo, ver la utilidad DSKINF.


Activar la seguridad del sistema
Para tener más control de lo que pasa en nuestro sistema, y seguramente poder cumplir con las auditorias de seguridad, es más que recomendable activar el diario de auditoria del sistema. El procedimento para hacerlo ya esta publicado en esta entrada: Configurar seguridad del sistema.
Lo unico que habra que tener en cuenta es que necesitaremos más espacio en disco para los receptores del diario de auditoria; además debemos crear un procedimento para gestionarlos (habitualmente guardarlos a cinta y eliminarlos)

Tareas a revisar y/o ejecutar periódicamente:
  • Copia de seguridad de nuestros datos diariamente (GO BACKUP)
  • Una copia completa del sistema (semanal o mensual o trimestral), y aprovechar para realizar un IPL (GO SAVE, opción 21)
  • Problemas detectados por el sistemas (WRKPRB)
  • Actualizar el nivel del acumulativo y grupos de ptf (WRKPTFGRP)
  • Ejecutar una reclamación de espacio en disco, después de una caída no planificada del sistema (RCLSTG)
  • Actualizar el sistema operativo antes de quedar sin soporte por parte de IBM.
  • ...

Documentar todos los cambios realizados en el sistema
Cuando cambiamos:
  • El valor de un variable del sistema.
  • La configuración de un subsistema suministrado por IBM.
  • Las clases con los parámetros de ejecución.
  • La configuración de los pools de memoria.
  • Descripción de los mensajes, en los archivos de mensajes suministrados por IBM.
  • ect...
Es una buena practica documentar dichos cambios en algun documento.
Suelo utilizar un miembro fuente en la QGPL/QCLSRC, por ejemplo SYSCUST, donde voy insertando los cambios realizados con un comentario de la razón. De esta forma en caso de migrar el sistema a un nuevo hardware, tendremos todos estos cambios documentados y podremos reproducirlos más fácilmente.


viernes, 24 de mayo de 2013

Utilidad estadisticas espacio en disco (DSKINF)

En un articulo anterior se explicaba como activar las estadísticas de espacio en disco incluidas con el sistema operativo de nuestro AS400.

Analizando el funcionamiento de dicha función del AS400 desarrolle, hace años, la utilidad CPYDSKINF, para consolidar, periódicamente, esta información en otro archivo y así poder realizar análisis de la evolución del crecimiento de la ocupación en disco, de las bibliotecas y/o de los objetos.

La periodicidad podría ser semanal, o como mínimo mensual, aunque deberemos analizar cual es la mejor periodicidad para nuestro sistema y nuestras necesidades. Deberemos tener en cuenta que este proceso genera, acumula mucha información, y necesita mucho tiempo de ejecución,  aunque, evidentemente, dependerá del rendimiento de nuestro sistema.
Si usamos esta utilidad es recomendable no utilizar la opción de planificación de recogida de estadísticas de espacio en disco del sistema (GO DISKTASKS), ya que estaremos duplicando el proceso y podemos tener problemas si los lanzamos al mismo tiempo.

Para planificar la ejecución semanal, de esta utilidad, utilizar el siguiente mandato:
ADDJOBSCDE JOB(CPYDSKINF) CMD(CALL PGM(DSKINF/CPYDSKINF)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*SUN) SCDTIME('23:59:59') RCYACN(*SBMRLS) JOBQ(QSYS/QUSRNOMAX) 
TEXT('Statistical disk space usage')

A partir de los datos recogidos, semana a semana, podemos utilizar Query's, Consultas QM o SQL, para extraer información sobre la evolución de la ocupación del disco, bibliotecas y de los objetos  en el sistema. También nos puede servir para averiguar en que periodo se elimino un objeto, que objetos se han creado entre periodos, etc...

El programa actualiza los tres archivos DSKINF, EVODSK y EVOLIB:
  • DSKINF: Contiene la misma información que QAEZDISK, pero con 2 campos más que contienen el nombre del sistema, donde se ha recogido la información, y la fecha de recogida (en formato saammdd).
  • EVODSK: Se genera en cada ejecución y contiene un registro por cada fecha de recogida con la ocupación en disco y el total de disco cuando se recogió la información.
  • EVOLIB: Se genera en cada ejecución y contiene un registro por cada fecha de recogida y biblioteca, con el tamaño de la misma cuando se recogió la información.
En el código del programa CPYDSKINF, la variable &DLTDAT nos indica cuanto tiempo debe conservar los datos de información de espacio en disco en el sistema, de esta forma el tamaño de la biblioteca DSKINF sera, más o menos, constante. Por omisión se conservan 365 días.

Seguid las instrucciones de instalación de la utilidad en el fuente README_DSK.TXT incluido. Se recomienda instalarla en la biblioteca DSKINF, de esta forma tendremos más controlado el espacio que ocupa esta información. Podéis bajaros el código desde este enlace.

Esta utilidad consta de varios fuentes y objetos:
ADDDSKINF   RPG   Añade registros informe espacio disco
CPYDSKINF   CLP   Genera, consolida e imprime informes disco
DSKINF      PF    Informe espacio en disco
EVODSK      SQL   Evolución espacio en disco

EVODSK_CRT  SQL   Creación archivo evolución espacio en disco 
EVOLIB      SQL   Evolución ocupación bibliotecas

EVOLIB_CRT  SQL   Creación archivo evolución ocupación bibliotecas 
RMVDSKINF   RPG   Elimina registros informe espacio disco

README_DSK  TXT   Instrucciones de instalación de DSKINF 

Notas:

martes, 21 de junio de 2011

Averiguar cuando se hizo el ultimo SAVSYS

Si nunca habéis tenido la necesidad de averiguar cuando se hizo el ultimo SAVSYS en nuestro sistema AS400, aquí tenéis un enlace a un interesante articulo donde explica como averiguarlo:

miércoles, 16 de marzo de 2011

Autoarranque servicios TCP/IP

El mandato STRTCPSVR tiene el valor *ALL por omisión para el parámetro SERVER. Si no tenemos controlado el uso de este mandato, se arrancaran un montón de servicios TCP/IP y que puede que no necesitemos en nuestras aplicaciones, consumiendo además, recursos del sistema para nada.
Un ejemplo podría ser el servidor de correo SMTP que, evidentemente si no lo usamos en nuestro sistema, puede consumir recursos y darnos algún dolor de cabeza.

Por esta razón recomiendo cambiar el valor por defecto del comando STRTCPSVR (solo válido solo para las versiones del OS/400 V4R5 o superiores):
CHGCMDDFT  CMD(STRTCPSVR) NEWDFT('SERVER(*AUTOSTART)')

De esta forma si se ejecuta un STRTCPSVR sin parámetros, en lugar de arrancar todos los servicios TCP/IP, solo se arrancaran los que hayamos definido como autoarranque nosotros. Además prevendremos posibles ataques por los puertos de los servicios que no estamos utilizando.

¿Como hacemos esto?, pues con el mandato CFGTCP, seleccionamos la opción 20, y vamos modificando todos servicios, que nos interese arrancar automáticamente, con el parámetro AUTOSTART(*YES), el resto los dejamos con el valor *NO. Eso si hemos de tener muy claro que servicios usamos y cuales no.
Para algunos servicios existen comandos para cambiarlos directamente desde la linea de mandatos, por ejemplo para el FTP Trivial: CHGTFTPA AUTOSTART(*NO)

¡¡Ojo!! Hay algunos servicios que solo se pueden configurar desde el "Navegador de Operaciones" (menú Network, Servers, TCP/IP). Para modificarlos usar el botón derecho sobre cada servicio (Propiedades) y desmarcar o marcar la casilla "Start when TCP/IP is started".

¡¡Ojo!!  También deberemos verificar el programa QSTRUP, o el que utilicemos en nuestro sistema, no tenga "hardcode" el mandato STRTCPSVR SERVER(*ALL).

miércoles, 6 de octubre de 2010

Tabla de trabajos

El mandato DSPSYSSTS nos  muestra una pantalla con el estado del sistema.
Uno de los valores que hemos de tener en cuenta ,en sistemas con muchos trabajos, es "Jobs in system" que nos indica cuantos JobID tiene el sistema, esto incluye cualquier trabajo que este en cola de trabajos, en estado activo o en cola de salida.

Existe un valor de sistema que nos indica cual es el numero máximo de trabajos en el sistema : DSPSYSVAL SYSVAL(QMAXJOB)

El sistema usa unas tablas para controlar los trabajos que están en el sistema, cada una de ellas puede contener 16352 entradas, con los JobId de los trabajos, que están en el sistema.

Con el mandato DSPJOBTBL podemos visualizar el estado de dichas tablas.

Es importante tener activada la limpieza del sistema (ver entrada Limpiar automaticamente mensajes, joblogs, dumps, ...) para evitar llegar a llenar las tablas de trabajos y tengamos una parada anormal del sistema.

lunes, 21 de junio de 2010

Impacto del ENDJOBABN

El comando ENDJOBABN tiene la finalidad de terminar trabajos que aparentemente no responden a una finalizacion con el mandato ENDJOB.
Es muy recomendable no utilizar normalmente este mandato, ya que tiene implicaciones ocultas.
Una vez ejecutado se activa una marca en el sistema por el cual el siguiente IPL sera considerado "anormal" y el sistema al arrancar realizara una serie de tareas de comprobación del sistema adicionales que alargaran el tiempo de IPL.
Ademas si hay alguna ptf pendiente de aplicar en IPL no se aplicará, ya que el sistema considera que no debe instalarlas en una IPL con terminación anormal.

Existe un valor de sistema para ver cual si el ultimo IPL fue anormal, para ello ejecutar el comando: DSPSYSVAL SYSVAL(QABNORMSW)
Esto nos mostrara uno de los siguientes valores:
0=Normal 
1=Abnormal

lunes, 29 de marzo de 2010

Uso del mandato WRKACTJOB

Uno de los mandatos más utilizados en el AS400 es el WRKACTJOB (Trabajar con Trabajos Activos), ¿Pero le sacamos todo el partido a este mandato?
En primer lugar comentar que este mandato es un consumidor de recursos, por tanto no es recomendable que estén varias personas ejecutándolo al mismo tiempo. La primera vez que usamos el mandato puede que nos salga una pantalla parecida a esta:
Esta nos muestra las opciones y las teclas de Función que podemos usar. Una vez tengamos soltura con esas opciones y funciones, podemos pulsar F21=Nondisplay instructions/keys para ocultarlas, de esta forma podemos ver más trabajos en la misma pantalla:

La primera vez que ejecutamos este mandato en nuestra sesión, se activan unas estadísticas que se actualizaran cada vez que pulsemos F5=Refresh, con lo que acumulara y hará las medias aritméticas de los valores de algunas columnas marcadas bajo la denominación Elapsed, como la del porcentaje de uso de CPU de los trabajos. En la parte superior tenemos el campo Elapsed time que nos indica el tiempo desde el ultimo reset de las estadísticas. También vemos CPU % que indica el total de uso de CPU del sistema para el total de procesadores que tengamos. El total de trabajos en el sistema se nos indica en el campo Active jobs.
Si pulsamos F10=Restart statistics, resetearemos las estadísticas a 0, esto nos puede servir para comprobar el consumo puntual de CPU (snapshot) de un trabajo.

También podemos utilizar F19=Start automatic refresh para dejar la pantalla en modo de refresco automático, que como si pulsáramos F5 cada n segundos, el valor por omisión esta indicado en el parámetro INTERVAL del mandato, por omisión es *PRV o sea el ultimo utilizado, aunque la primera vez son 300 segundos. Esto nos puede ser útil para controlar algún trabajo en concreto desde una pantalla.

Con F17=Top podemos ir al principio de pantalla y con F18=Bottom al final, esto nos sirve para movernos algo más rápido, sobre todo si tenemos muchos trabajos.

Con F11 podemos cambiar las vistas para ver más información sobre el trabajo, hay 3 vistas diferentes que aparecen cada vez que pulsamos la tecla de función.

El mandato WRKACTJOB permite filtrar por:
  • Nombre de subsistema (SBS) para por ejemplo ver solo los trabajos interactivos en el subsistema QINTER y/o QCTL:
    • WRKACTJOB SBS(QCTL QINTER)
  • Nombre de trabajo (JOB) para ver solo los trabajos que:
    • Empiecen por un nombrte:
      • WRKACTJOB JOB(MyJob*)
    • Trabajos del sistema:
      • WRKACTJOB JOB(*SYS)
    • O trabajos de subsistema activos:
      • WRKACTJOB JOB(*SBS)
  • Podemos filtrar por:
    • Uso de CPU (CPUPCTLMT), por ejemplo los trabajos que consumas mas de un 15% de CPU: WRKACTJOB CPUPCTLMT(15)
    • Tiempo de respuesta interactivo (RSPLMT) de una sesión (pantalla verde), por ejemplo una pantalla que tarde más de 5 minutos en ejecutar un programa/mandato: WRKACTJOB RSPLMT(300)
Otra opción muy interesante es el parámetro Sequence (SEQ) que nos permite ordenar por alguna de las columnas del mandato, un clásico es ordenar por consumo de CPU para averiguar que trabajo se nos esta llevando el procesador: WRKACTJOB SEQ(*CPU) o por Total de unidades de CPU consumidas (en segundos) WRKACTJOB SEQ(*CPUPCT). Para más información pulsar F1=Help sobre campo del parámetro y podremos ver una explicación más detallada de todas las opciones posibles.

Una opción que utilizo bastante es ordenar por una columna, combinándola con otras opciones explicadas, por ejemplo la de Status de los trabajos, para ello situamos el cursor encima del titulo de la columna y pulso F16=Resequence de esta forma puedo encontrar, más rápidamente, todos los trabajos que están en estado MSGW.
Nota: Tener en cuenta que si queremos ordenar por subsistema debemos situar el cursor encima de la columna Subsystem/Job, pero si queremos ordenar por nombre de trabajo deberemos situar el cursor encima del primer carácter del nombre de trabajo que aparezca en la pantalla.

Otra opción, poco conocida, es que el mandato WRKACTJOB oculta los trabajos de prearranque inactivos (PJ) o grupos de sesión inactivos (INT), es cuando pulsamos la tecla PetSys + opción 1 (Mayusc+Esc) o la tecla de Atención de Sistema (Esc). Para visualizarlos hemos de pulsar F14=Include, un ejemplo para el subsistema QSERVER:
WRKACTJOB SBS(QSERVER)
En esta pantalla solo vemos 5 trabajos, pero si pulsamos F14 nos aparecen más de 14 trabajos:

Finalmente podemos usar la tecla de función F15=Work with system status que ejecuta el mandato WRKSYSSTS que necesitaría un libro para explicar su utilidad, podéis consultar la siguiente entrada para tener alguna idea sobre el tema: Como saber si el AS400 necesita mas RAM

lunes, 8 de marzo de 2010

Configurar seguridad del sistema

Existe un  mandato para configurar automáticamente la seguridad básica del sistema. Ejecutándolo nos cambiará varios valores de sistema:
QALWOBJRST=*NONE
QAUTOCFG=0        
QAUTOVRT=0         
QDEVRCYACN=*DSCMSG
QDSCJOBITV=120    
QDSPSGNINF=1      
QINACTITV=60      
QINACTMSGQ=*ENDJOB
QLMTDEVSSN=1       
QLMTSECOFR=1       
QMAXSGNACN=3       
QMAXSIGN=3         
QRMTSIGN=*FRCSIGNON
QRMTSRVATR=0       
QSECURITY=50       
QVFYOBJRST=3       
QPWDEXPITV=60       
QPWDMINLEN=6 si es <6, u 8 si es <8
QPWDLMTCHR=Contenido del msgid CPXB302
QPWDLMTAJC=1     
QPWDLMTREP=2     
QPWDRQDDGT=1     
QPWDRQDDIF=1      
QPWDVLDPGM=*NONE


También desactivara la contraseña, con PASSWORD(*NONE), de los siguientes usuarios: QSYSOPR, QPGMR, QUSER, QSRV y QSRVBAS.
De esta forma evitamos que nadie se conecte al sistema utilizando estos perfiles.

Finalmente, si existe el diario de auditoria (QAUDJRN), ejecutará el mandato CHGSECAUD (Cambia auditoría de seguridad) que cambiara los siguientes valores de sistema: QAUDCTL=*AUDLVL y QAUDLVL=*DFTSET, que incluye la auditoria de todos los conceptos siguientes:
*ATNEVT, *CREATE, *AUTFAIL, *DELETE, *JOBDTA, *NETBAS, *NETCLU, *NETCMN, *NETFAIL,
*NETSCK, *OBJMGT, *OFCSRV, *OPTICAL, *PGMADP, *PGMFAIL,*PRTDTA, *SAVRST, *SECCFG, *SECDIRSRV, *SECIPC, *SECNAS, *SECRUN, *SECSCKD, *SECURITY, *SECVFY, *SECVLDL, *SERVICE, *SPLFDTA, *SYSMGT.

Para más información sobre estos valores buscad en el IBM iSeries Information Center 

Al ejecutar el mandato CFGSYSSEC aparecerá una pantalla que nos pedirá confirmación:
Es recomendable ejecutar este mandato con el sistema restringido y conectado con usuario *SECOFR.
Podemos modificar los valores por omisión de este programa, que nos interesen para nuestro sistema, recuperando, editando y creando nuestra propia versión.
Para recuperar el fuente del programa utilizar el mandato:
RTVCLSRC PGM(QSECCFGS) SRCFILE(MYSRCLIB/MYSRCFILE) SRCMBR(MYQSECCFGS)

lunes, 1 de marzo de 2010

Utilizar los menus de ayuda

Es interesante recordar los sistemas de ayuda para buscar un mandato y que nos pueden ser muy útiles, existen varias opciones:

Situar el cursor en la línea de mandatos del AS400, al pulsar F4 aparece el menú "Major Command Groups", también podemos acceder con GO MENU(MAJOR).
En el menú MAJOR podemos intentar buscar una opción que, por la descripción, pueda contener el mandato que estamos buscando.  Muchas veces nos aparecerán submenus. Las 3 primeras opciones, del menú MAJOR, son más interesantes ya que son búsquedas genéricas, el resto son temáticas. 

Un ejemplo si queremos visualizar el contenido de la cola de salida QGPL/QPRINT, seleccionaríamos la opción "11. Spooling Commands", a continuación "4. Output Queue Commands"  y finalmente "8. Work with Output Queue" que ejecuta el mandato que buscábamos WRKOUTQ, solo hace falta indicarle en el parámetro OUTQ la cola QPRINT y pulsar Intro. Evidentemente es más rápido acordarse del mandato WRKOUTQ OUTQ(QGPL/QPRINT), pero si no lo conocemos, pero si la manera de buscarlo, seguramente lo encontraremos.

Con la opción "1. Select Command by Name" podemos seleccionar por los caracteres con los que suponemos empieza el mandato. Por ejemplo si usamos DSP* (Display) nos mostrará la lista de mandatos utilizados para visualizar algo. Podemos utilizar directamente el mandato SLTCMD, o incluso mejor tecleando los caracteres iniciales del mandato y añadiendo el carácter * al final, desde la linea de mandatos, y pulsando Intro: Probad WRKJOB*.

La opción "2. Verb Commands" (VERB) nos lista un menú con los mandatos agrupados por verbo. Por ejemplo si queremos ver todos los mandatos para verificar el estado de algo (CMDVFY) utilizaremos la opción "85. Verify Commands".

Otra opción es "3. Subject Commands" (SUBJECT), con esta se nos muestra una lista de mandatos agrupados por la función que realizan. Un ejemplo seria ver todos los mandatos que se utilizan para gestionar un dispositivo, para ello seleccionaríamos la opción "89. Device Commands".

Darse cuenta que todos estos menús en la parte superior izquierda muestran el nombre del menú por lo que podemos acceder a ellos directamente con el mandato GO y el nombre de menú.

Todos los submenus tienen nombre para poder acceder a ellos directamente, siguen la filosofía de denominación del AS400, con lo que se nos facilita su búsqueda por "intuición". Por ejemplo queremos ver todos los mandatos (CMD) que se pueden utilizar para la definición (D) de un subsistema (SBS), pues nada tecleamos GO MENU(CMDSBSD), pulsamos Intro y "voilà":
 Nota: Los números de opción que se muestran es para la versión V5R4M0, pero pueden variar para otras versiones.

sábado, 19 de diciembre de 2009

Biblioteca de trabajo TEMP

Para poder crear objetos de trabajo es muy recomendable utilizar la biblioteca QTEMP, que el sistema crea solo para nuestro trabajo automáticamente. Pero si los objetos creados en esa biblioteca deben ser usados en mas de un trabajo, o sesión, o accedidos por odbc, bajados por ftp, o tenerlos en el sistema durante unos días, es muy conveniente tener una biblioteca que no desaparezca y que pueda ser compartida por mas de un trabajo, para ello nada mejor que crear la biblioteca TEMP (o como queráis llamarle), con autorización *PUBLIC *ALL. Para ello ejecutar los mandatos:
  • CRTLIB LIB(TEMP) TYPE(*TEST) TEXT('Temporary library (cleared weekly automatically)')
  • CHGOBJOWN OBJ(TEMP) OBJTYPE(*LIB) NEWOWN(QPGMR)
Con la misma idea podemos crear el directorio /home/temp:
  • CRTDIR DIR('/home/temp') DTAAUT(*RWX) OBJAUT(*ALL)
  • CHGOWN OBJ('/home/temp') NEWOWN(QPGMR)  
Para que esta biblioteca y directorio, no se conviertan en un contenedor de basura es muy recomendable realizar una limpieza periódica de su contenido.
Los objetos que se crean en esta biblioteca y directorio se podrían  eliminar automáticamente todos los domingos a las 06:00h (por ejemplo), con el trabajo planificado CLRTEMP.

Mandato para planificar dicho trabajo:
ADDJOBSCDE JOB(CLRTEMP) CMD(CALL PGM(MYLIB/CLRTEMP)) FRQ(*WEEKLY) SCDDATE(*NONE) SCDDAY(*SUN) SCDTIME(060000)
JOBQ(QUSRNOMAX) TEXT('Clear library TEMP and /home/temp')

Código del programa CLRTEMP

jueves, 12 de noviembre de 2009

Planificador de trabajos

El objeto de planificación de trabajos contiene entradas que configuran una planificación de trabajos (WRKJOBSCDE). Puede planificar trabajos añadiendo una entrada de planificación de trabajos al objeto de planificación de trabajos (ADDJOBSCDE). 
Para que funcione el planificador de trabajos debe estar activo el trabajo QSYSSCD en el subsistema QCTL (o QBASE) y se arranca automáticamente después del IPL.


El objeto de planificación de trabajos, QDFTJOBSCD, está en la biblioteca QUSRSYS y tiene un tipo de objeto *JOBSCD. No puede crear, suprimir, redenominar ni duplicar el objeto de planificación de trabajos, y no puede moverlo a otra biblioteca. Este objeto de planificación de trabajos se suministra con la autorización de uso público *CHANGE. Esta es la mínima autorización necesaria para añadir, cambiar, retener, liberar y eliminar entradas de planificación de trabajos.

Cómo guardar o restaurar objetos de planificación de trabajos
El objeto de planificación de trabajos puede salvarse con los mandatos Salvar Biblioteca (SAVLIB), Salvar Objeto (SAVOBJ) o Salvar Objetos Cambiados (SAVCHGOBJ), y después restaurarse con los mandatos Restaurar Biblioteca (RSTLIB) o Restaurar Objeto (RSTOBJ). La restauración del objeto de planificación de trabajos hace que la próxima fecha de sometimiento se actualice para cada entrada. Puede restaurar el objeto de planificación de trabajos al sistema desde el que se salvó o a un sistema distinto, pero no puede restaurarlo a una biblioteca que no sea QUSRSYS. Si restaura el objeto de planificación de trabajos a un sistema diferente, el registro histórico de sometimiento de trabajos se borra en cada entrada.


Información extraída del manual Gestión de Trabajos, capitulo Planificación de trabajos (pag.267)

miércoles, 28 de octubre de 2009

Cancelar un rollback

En un artículo anterior se explicaba como averiguar el porcentaje rollback realizado por un trabajo.

Pero en muy contadas excepciones nos puede interesar cancelar un rollback, cosa realmente peligrosa sino conocemos, pero que muy bien, lo que esta haciendo el trabajo en la base de datos.

Por norma un rollback NUNCA se debe cancelar, debemos esperar que termine.

No se os ocurra realizar un IPL para forzar la finalización de un rollback, ya que el sistema lo terminara durante el IPL, con lo os quedareis sin sistema durante un tiempo indeterminado.

Dicho lo anterior, unos ejemplos de casos en que nos puede interesar cancelar el rollback:

  • Supongamos que lanzamos un programa que crea una tabla temporal, abre un ciclo de commit y empieza a insertar registros en esta tabla, el programa se mete en un bucle y continua insertando registros, cuando lleva unos cuantos millones de insert nos damos cuenta y cancelamos el trabajo. Entonces empieza a realizar el rollback eliminando millones de registros insertados. En este caso si pudiéramos cancelar el rollback y eliminar la tabla temporal seguro que terminaría más rápido que esperar el final del rollback.
  • Un programa se mete en un bucle actualizando miles de veces el mismo registro, es importante verificarlo con las entradas del diario. Al cancelarlo el rollback empezara a realizar miles de update en sentido inverso hasta dejarlo en el valor original. También en este caso si supiéramos el valor del registro al inicio del bucle, podríamos cancelar el rollback y después realizar un update manual del registro a su valor inicial; con esto ahorraríamos seguramente mucho tiempo.
  • Un trabajo realiza cambios en una o mas tablas, utilizando un solo ciclo de commit, cuando lleva unos millones de cambios cancelamos el trabajo. Si tenemos la absoluta seguridad que tenemos una copia de las tablas antes de empezar el proceso y que ningún otro trabajo ha realizado cambios en las mismas, podríamos valorar la posibilidad de cancelar el rollback y restaurar las tablas.
A partir de la V5R3 existe un procedimiento para cancelar un rollback, es el siguiente:
  1. Definir la estrategia para reparar la base de datos: Asegurarse de que tenemos los datos necesarios, verificar que tenemos las copias de seguridad, son accesibles  y contienen las tablas implicadas (recordar los ejemplos).
  2. Conectarse con usuario con permisos *SECOFR.
  3. Lanzar el ENDJOB, con OPTION(*IMMED), del trabajo que empezara a realizar el rollback.
  4. Averiguar el ciclo de compromiso del rollback que vamos a cancelar:
  5. WRKCMTDFN JOB(012345/MYUSER/MYJOB)
  6. Pulsar F23 para ver más opciones y  aparecerá la opción 20=End rollback.
  7. Introducir la opción 20 en el ciclo de compromiso a cancelar y pulsar Intro.
  8. Nos aparecerá una pantalla (ver imagen) que nos advierte del peligro de cancelar el rollback, ya que dejaremos inconsistente la base de datos y eso podría afectar a otros trabajos.
  9. Si estamos seguros pulsaremos Intro. Sino podemos pulsar F12 para volver atras.
  10. A partir de ese momento el trabajo empezará a liberar los registros bloqueados por el commit, cancelando el rollback. Esto puede tardar algún tiempo dependiendo de la cantidad de registros.
  11. Una vez a finalizado el rollback y el trabajo, podremos reparar la base de datos, según la estrategia decidida en el primer paso. En los ejemplos: Eliminar la tabla temporal, Actualizar manualmente el registro implicado, Restaurar la/s tabla/s implicadas.


ADVERTENCIA FINAL: Es responsabilidad vuestra el utilizar, o no, este procedimiento. Como comprenderéis podéis causar un daño irreversible a la base de datos, si no estáis absolutamente seguros de lo que vais a hacer. En caso de la más mínima duda os recomiendo esperar al final del rollback.

Más información en el documento: Ending A Rollback - V530 and Later Releases

lunes, 19 de octubre de 2009

Cambio hora verano/invierno


La madrugada del ultimo domingo de Octubre los sistemas deben cambiar la hora al horario de invierno, o sea a las 3:00 se retrasara la hora a las 2:00 horas.
Actualmente, a partir de la V5R4, podemos configurar el sistema para que automáticamente realize el cambio de hora sin nuestra intervención, para ello debéis seguir las indicaciones del articulo:
Sincronizar la hora del AS400
Pero si tenemos un sistema con una versión anterior del OS400, podemos utilizar mi utilidad SUMWIN para realizar el cambio de hora automáticamente.

La estrategia para realizar el cambio de hora es añadir un trabajo automático al planificador de tareas el siguiente mandato (con usuario QSECOFR):
ADDJOBSCDE JOB(SUMWIN) CMD(CALL PGM(SUMWIN)) FRQ(*MONTHLY) SCDDATE(*NONE) SCDDAY(*SUN) SCDTIME(020000) RELDAYMON(*LAST) JOBQ(QSYSNOMAX) TEXT('Cambio automático a horario de verano-invierno')

Con esto conseguimos que cada ultimo domingo de mes se lance el trabajo y solo cambiara la hora cuando sea:
  • El ultimo domingo del mes de Marzo a las 02:00:00 sumara una hora o
  • El ultimo domingo del mes de Octubre esperara a las 03:01:00 y restara una hora,
  • En ambos casos envía un mensaje al operador.
  • El resto de meses no hará nada.

jueves, 15 de octubre de 2009

Cambios en variable de sistema QLMTDEVSSN (V6R1)

La nueva versión del i5/OS V6R1, incluye un muy esperado nuevo valor para la variable del sistema QLMTDEVSSN (Limit device session).

Hasta la versión V5R4 podíamos tener los siguientes valores:
0=Do not limit = El usuario puede abrir tantas sesiones interactivas como quiera.
1=Limit = El usuario solo puede abrir una sesion interactiva.

Con la V6R1 se modifican los valores de esta variable como sigue:
0=Do not limit = El usuario puede abrir tantas sesiones interactivas como quiera.
1-9=Maximum device sessions = Este valor nos indica cuantas sesiones podrá abrir como máximo un usuario 1,2,.. y hasta 9 sesiones interactivas concurrentes.

Para ver que valor tiene el sistema: 
DSPSYSVAL SYSVAL(QLMTDEVSSN)

Por defecto es preferible, sobretodo en los sistemas de Producción, que este valor de sistema este a 1, así todos los usuarios, que en el parámetro LMTDEVSSN de su perfil de usuario tengan el valor *SYSVAL, solo podrán abrir una sesión interactiva por defecto. A los Operadores y/o Administradores podemos darles más sesiones cambiando este valor en su perfil de usuario.

Pero puede ser interesante tener el valor de sistema a 2 o 3 en los sistemas de Desarrollo, para que al crear un nuevo programador, y sin tener que cambiar su perfil de usuario, ya pueda tener más de una sesión interactiva, cosa muy solicitada y recomendable para poder realizar pruebas, del código que están creando y probando, mas cómodamente.

lunes, 4 de mayo de 2009

Cola de mensajes QSYSMSG

El sistema operativo del AS400 tiene una función oculta y especial para enviar los mensajes que requieran alguna acción por parte del usuario (operador o administrador), a la cola de mensajes especial QSYSMSG. Esta cola de mensajes no existe al instalar el sistema operativo y debemos de crearla manualmente:


CRTMSGQ MSGQ(QSYS/QSYSMSG) TEXT('Special system messages queue') MSGQFULL(*WRAP)

Otorgamos la propiedad a QSECOFR: 
CHGOBJOWN OBJ(QSYS/QSYSMSG) OBJTYPE(*MSGQ) NEWOWN(QSECOFR)

Con esto los mensajes de cierta gravedad se escribirán en la cola de mensajes QSYSMSG, ademas de en la cola QSYSOPR. Esto puede facilitarnos la monitorización de mensajes del sistema.

Podéis encontrar información sobre esta funcionalidad en el IBM Information Center