Bibliotecas, IFS, Library List, tipos de objetos, archivos físicos y lógicos, subsistemas, gestión de trabajos, colas y spool.
En IBM i, el equivalente a una "carpeta" es una Biblioteca (Library), pero con una diferencia crucial: las bibliotecas no se anidan (no podés tener una biblioteca dentro de otra, excepto QSYS que las contiene todas).
QSYS— biblioteca del sistema, las contiene a todasQGPL— biblioteca general del usuarioQTEMP— temporal, se borra al cerrar sesiónMIAPP_PROD— tu aplicación, producciónMIAPP_DEV— tu aplicación, desarrolloPara referenciar un objeto usás el nombre calificado: BIBLIOTECA/OBJETO
Bibliotecas del sistema importantes:
QSYSBiblioteca maestra, contiene todas las demás y objetos del sistema
QGPLGeneral Purpose Library, disponible para todos
QTEMPTemporal, se crea por cada sesión y se destruye al finalizar
QSYS2Funciones SQL y vistas del sistema
QUSRSYSObjetos creados por el sistema para los usuarios
QRECOVERYObjetos de recuperación del sistema
CRTLIB LIB(MIAPP) Crear una biblioteca DLTLIB LIB(MIAPP) Eliminar una biblioteca WRKLIB LIB(MI*) Ver bibliotecas que coincidan con patrón DSPLIB LIB(MIAPP) Ver contenido de una biblioteca WRKOBJ OBJ(MIAPP/*ALL) Ver todos los objetos de una biblioteca
Cada trabajo tiene una library list que determina dónde buscar objetos, similar al PATH de Linux/Windows. Cuando ejecutás un programa sin calificar (CALL MIPROG), el sistema busca recorriendo la library list de arriba a abajo.
La library list se compone de tres secciones, evaluadas en este orden:
System portion
Bibliotecas del sistema (QSYS, QSYS2, QHLPSYS, QUSRSYS). Configuradas por el administrador, no se modifican habitualmente.
Product libraries
Bibliotecas agregadas automáticamente por productos IBM (ej: QRPGLE para compilar RPG). Temporales y contextuales.
User portion (Current + User libs)
Las bibliotecas que vos controlás. Incluye la Current Library y las User Libraries. Aquí ponés tus bibliotecas de aplicación.
DSPLIBL Mostrar la library list actual ADDLIBLE LIB(MIAPP) Agregar biblioteca a la user portion RMVLIBLE LIB(MIAPP) Quitar biblioteca de la library list CHGLIBL LIBL(MIAPP QGPL) Reemplazar toda la user portion CHGCURLIB CURLIB(MIAPP) Cambiar la Current Library EDTLIBL Editor interactivo de la library list
PATHpor sesión que podés modificar en caliente. Si en Linux tenés /usr/local/bin:/usr/bin, en IBM i tendrías MIAPP_DEV:MIAPP_COMMON:QGPL.Todo en IBM i es un objeto. Cada objeto tiene un tipo que determina qué operaciones se pueden hacer con él. Esto es mucho más estricto que en x86, donde un archivo es solo una secuencia de bytes.
*PGMProgramaEjecutable binario (.exe, ELF)*SRVPGMService ProgramShared library (.so, .dll)*MODULEMóduloObjeto compilado (.o, .obj)*FILEArchivoTabla de BD / archivo de datos*DTAARAData AreaVariable global persistente / config*DTAQData QueueCola de mensajes (message queue)*USRSPCUser SpaceBloque de memoria compartida*MSGQMessage QueueCola de mensajes del sistema*JOBDJob DescriptionPerfil de ejecución / systemd unit*SBSDSubsystem DescriptionDefinición de servicio / daemon config*OUTQOutput QueueCola de impresión*CMDCommandComando del shell (con validación)*BNDDIRBinding DirectoryCatálogo de linkeo (ld search path)*USRPRFUser ProfileCuenta de usuario (/etc/passwd)WRKOBJ OBJ(MILIB/*ALL) Ver todos los objetos de una biblioteca WRKOBJ OBJ(MILIB/*ALL) OBJTYPE(*PGM) Solo programas DSPOBJD OBJ(MILIB/MIPROG) OBJTYPE(*PGM) Detalle de un objeto MOVOBJ OBJ(MIPROG) OBJTYPE(*PGM) TOLIB(OTRA) Mover objeto CRTDUPOBJ Duplicar un objeto entre bibliotecas RNMOBJ OBJ(VIEJO) OBJTYPE(*PGM) NEWOBJ(NUEVO) Renombrar
miprog es un ejecutable hasta que lo abrís. En IBM i, el sistema sabe que un *PGM es un programa y no te deja tratarlo como un archivo de datos. Esta tipificación estricta previene errores y mejora la seguridad.En IBM i, los datos se almacenan tradicionalmente en Physical Files (PF) y se acceden a través de Logical Files (LF). Hoy en día se usan también tablas y vistas SQL, pero los conceptos PF/LF siguen siendo fundamentales.
Physical File (PF)
Logical File (LF)
Un archivo físico puede contener múltiples miembros. Cada miembro tiene el mismo formato de registro pero datos distintos. Esto se usa mucho para source files (ver siguiente sección) y para separar datos por período (ej: un miembro por mes).
Terminología DDS (tradicional)
Terminología SQL (moderna)
CRTPF FILE(MILIB/CLIENTES) SRCFILE(MILIB/QDDSSRC) Crear PF desde DDS CRTLF FILE(MILIB/CLIL1) SRCFILE(MILIB/QDDSSRC) Crear LF desde DDS DSPFD FILE(MILIB/CLIENTES) Descripción del archivo DSPFFD FILE(MILIB/CLIENTES) Descripción de campos RUNQRY *N MILIB/CLIENTES Consulta rápida de datos CPYF FROMFILE(MILIB/CLIENTES) TOFILE(MILIB/CLIBACK) Copiar archivo
El código fuente en IBM i no se guarda en archivos de texto plano como en x86. Se almacena en Source Physical Files (SPF) — archivos físicos especiales donde cada miembro es un "archivo fuente" (un programa, una DDS, etc.).
MILIB— tu biblioteca de desarrolloQRPGSRC— Source PF para fuentes RPGMIPROG— miembro = código fuente RPGOTROPROG— otro miembro RPGQCLSRC— Source PF para fuentes CLMISCRIPT— miembro = código fuente CLQDDSSRC— Source PF para DDS (PF/LF/DSPF)CLIENTES— miembro = DDS del archivo CLIENTESCLIL1— miembro = DDS del logical fileNombres convencionales de Source Physical Files:
QRPGSRCFuentes RPG IV (ILE RPG)
QRPGLESRCFuentes RPG IV (alternativo)
QCLSRCFuentes CL (Control Language)
QDDSSRCFuentes DDS (PF, LF, DSPF, PRTF)
QCBLLESRCFuentes COBOL ILE
QCSRCFuentes C/C++
QSQLSRCFuentes SQL
QCMDSRCFuentes de definición de comandos
QTXTSRCTexto y documentación
CRTSRCPF FILE(MILIB/QRPGSRC) RCDLEN(112) Crear SPF para RPG WRKMBRPDM FILE(MILIB/QRPGSRC) Editar fuentes con PDM/SEU STRSEU SRCFILE(MILIB/QRPGSRC) SRCMBR(MIPROG) Editar un miembro específico ADDPFM FILE(MILIB/QRPGSRC) MBR(NUEVO) SRCTYPE(RPGLE) Agregar miembro
Además de las bibliotecas tradicionales, IBM i tiene un sistema de archivos jerárquico tipo Unix/Windows. El IFS unifica varios sistemas de archivos bajo una única raíz /.
/— raízhome/FERNANDO/tmp/QSYS.LIB/— Bibliotecas tradicionales como archivosQGPL.LIB/MIAPP.LIB/QOpenSys/— POSIX (case-sensitive)usr/bin/QDLS/— Document Library ServicesEl IFS permite almacenar archivos tipo stream (PDFs, XMLs, JSONs, imágenes) y es donde viven las aplicaciones modernas (Java, Node.js, Python). El directorio /QOpenSyses un entorno POSIX completo donde podés instalar herramientas open source con yum.
/Root file system — case-insensitive, almacenamiento general
/QSYS.LIBInterfaz al sistema de bibliotecas tradicional. Cada biblioteca es un directorio, cada objeto un archivo.
/QOpenSysPOSIX completo, case-sensitive. Aquí corren bash, Python, Node.js, git. Es el puente al mundo moderno.
/QDLSDocument Library Services (legacy). Carpetas compartidas estilo PC.
/QNTCAcceso a shares de red Windows (CIFS/SMB). Conecta directo a servidores Windows.
WRKLNK '/' Ver el directorio raíz del IFS
WRKLNK '/home' Ver el directorio home
MKDIR DIR('/home/FERNANDO/datos') Crear directorio
CPYTOSTMF Copiar archivo tradicional a stream file
CPYFRMSTMF Copiar desde IFS a archivo tradicional
CPY OBJ('/home/a.txt') TOOBJ('/home/b.txt') Copiar en IFS
RMVLNK OBJLNK('/home/viejo.txt') Borrar archivo del IFSQSH Entrar a QShell (shell POSIX) CALL QP2TERM Entrar a PASE (shell AIX/bash) ls -la /home/FERNANDO Listar archivos cp archivo.txt /home/FERNANDO Copiar archivos python3 /home/scripts/etl.py Ejecutar script Python
Bibliotecas (QSYS.LIB)
IFS (/, /home, /QOpenSys)
Un subsistema es un entorno de ejecución controlado, similar a un servicio o daemon en Linux. Cada subsistema está definido por un objeto *SBSD(Subsystem Description) que especifica qué tipos de trabajos puede ejecutar, cuántos, con qué prioridad y qué recursos asignarles.
QCTLSubsistema de control (arranca primero, es el 'init' del sistema)QINTERTrabajos interactivos (sesiones 5250 de usuarios)QBATCHTrabajos por lotes (batch) — ejecuciones programadas o enviadasQSPLTrabajos de impresión (spool) — gestiona colas de impresiónQSERVERServidores de archivos/impresión para PCs (NetServer, etc.)QUSRWRKTrabajos del usuario (servidores HTTP, FTP, SMTP, etc.)QSYSWRKTrabajos del sistema (monitores, servicios internos)WRKSBS Ver subsistemas activos WRKSBSJOB SBS(QINTER) Ver trabajos de un subsistema STRSBS SBSD(QBATCH) Arrancar un subsistema ENDSBS SBS(QBATCH) OPTION(*IMMED) Detener un subsistema DSPSBSD SBSD(QINTER) Ver la descripción/configuración
Todo lo que se ejecuta en IBM i es un job. Un job tiene un nombre único compuesto por tres partes:
Tipos de trabajo:
Interactivo
Sesión de usuario conectado por 5250. Responde a teclas y pantallas.
Batch
Trabajo enviado a ejecutarse en segundo plano. No tiene pantalla.
Autostart
Se inicia automáticamente con el subsistema. Ideal para servidores.
Server
Trabajos de servidor (HTTP, FTP, base de datos, SMTP, etc.).
Cada trabajo se crea basándose en un Job Description que define su library list inicial, la cola de salida, la cola de trabajos, prioridad de ejecución y más. Es como un template de configuración para trabajos.
WRKACTJOB Ver todos los trabajos activos WRKACTJOB SBS(QINTER) Ver solo trabajos interactivos WRKACTJOB JOB(FERNANDO) Ver trabajos de un usuario WRKSBSJOB QBATCH Ver trabajos del subsistema batch SBMJOB CMD(CALL MIPROG) JOB(MINOCHE) Enviar programa a batch ENDJOB JOB(123456/FERNANDO/MIPROG) OPTION(*IMMED) Finalizar HLDJOB Pausar un trabajo RLSJOB Reanudar un trabajo pausado DSPJOB Ver detalle del trabajo actual CHGJOB RUNPTY(20) Cambiar prioridad de ejecución
Job Queue (*JOBQ)
Cola donde esperan los trabajos batch antes de ejecutarse. El subsistema toma trabajos de la cola según prioridad y límite de trabajos activos. Es como una cola de tareas (task queue) de un sistema de colas moderno (RabbitMQ, SQS).
Output Queue (*OUTQ)
Cola donde se almacenan los spool files (salidas impresas). Cada usuario tiene una output queue por defecto. Los reportes generados van aquí antes de imprimirse o descargarse.
WRKJOBQ JOBQ(QBATCH) Ver la cola de trabajos batch WRKOUTQ OUTQ(QPRINT) Ver la cola de salida HLDJOBQ JOBQ(QBATCH) Pausar la cola (no procesa más trabajos) RLSJOBQ JOBQ(QBATCH) Reanudar la cola CLROUTQ OUTQ(MIOUTQ) Limpiar una output queue
Cuando un programa genera salida impresa (reportes, listados, etc.), esa salida no va directamente a la impresora. Se almacena como un spool file en una output queue. Desde ahí podés verlo, descargarlo, imprimirlo o borrarlo.
Es el equivalente a un PDF generado por un proceso batch que queda en una carpeta de salida.
WRKSPLF Ver tus spool files WRKSPLF SELECT(*CURRENT) Solo los del trabajo actual DSPSPLF FILE(MIREPORTE) Ver contenido de un spool file CPYSPLF FILE(MIREPORTE) TOFILE(MILIB/SALIDA) Copiar a archivo DLTSPLF FILE(MIREPORTE) Borrar un spool file SNDNETSPLF Enviar spool file a otro sistema
CPYSPLF ... TOSTMF para generar un archivo en el IFS, o usar herramientas de IBM ACS para descargarlos directamente como PDF.Las colas de mensajes son el sistema de comunicación entre trabajos y entre el sistema y los usuarios. Cada usuario tiene una message queue personal, y hay colas especiales del sistema.
QSYSOPRCola del operador del sistema. Aquí llegan mensajes críticos y de atención.
User MSGQCada perfil de usuario tiene su propia cola. Mensajes de break, notificaciones.
Job MSGQCada trabajo tiene su cola interna. Los mensajes de error van aquí (job log).
*DTAQData Queues — colas programáticas para comunicación entre programas. Más rápidas que message queues.
DSPMSG MSGQ(QSYSOPR) Ver mensajes del operador del sistema
DSPMSG MSGQ(FERNANDO) Ver tus mensajes personales
SNDMSG MSG('Proceso completado') TOUSR(FERNANDO) Enviar mensaje
SNDBRKMSG MSG('Urgente') TOUSR(*ALLACT) Mensaje a todos los activos
CLRMSGQ MSGQ(FERNANDO) Limpiar tu cola de mensajesUn Data Area es un objeto que almacena un valor persistente — puede ser un string, un número decimal o lógico. Se usa comúnmente para:
Existe un data area especial por biblioteca: LDA (Local Data Area), que es privado de cada trabajo y se usa para pasar información entre programas dentro del mismo job.
CRTDTAARA DTAARA(MILIB/CONFIG) TYPE(*CHAR) LEN(100) VALUE('PROD')
DSPDTAARA DTAARA(MILIB/CONFIG) Ver el valor actual
CHGDTAARA DTAARA(MILIB/CONFIG) VALUE('DEV') Cambiar el valor
RTVDTAARA DTAARA(MILIB/CONFIG) RTNVAR(&VAR) Leer en CL program
DLTDTAARA DTAARA(MILIB/CONFIG) Eliminar data areaCada trabajo mantiene un job log — un registro cronológico de todos los mensajes generados durante su ejecución. Es el equivalente al log de una aplicación, pero gestionado por el sistema operativo.
El job log incluye:
DSPJOBLOG Ver el job log del trabajo actual DSPJOBLOG JOB(123456/FERNANDO/MIPROG) Job log de otro trabajo WRKJOB Opciones del trabajo actual DSPJOB Atributos del trabajo actual WRKSYSSTS Estado del sistema (CPU, memoria, disco) WRKSYSACT Actividad del sistema en tiempo real WRKDSKSTS Estado de los discos (ASPs) DSPMSG MSGQ(*SYSOPR) Mensajes del operador (errores del sistema)
El nivel de detalle del job log se controla con el parámetro LOG del job o job description. El formato es LOG(nivel severidad texto):
LOG(0 0 *NOLIST)Sin job log — solo errores fatales
LOG(1 0 *NOLIST)Mínimo — solo mensajes de escape
LOG(2 20 *SECLVL)Normal — errores y diagnósticos
LOG(4 0 *SECLVL)Máximo — todo, incluyendo comandos ejecutados
WRKSBSJOB QBATCH, buscar el trabajo que falló, y con opción 5 ver su job log. El último mensaje de tipo *ESCAPE te dice qué pasó. También podés usar DSPJOBLOG vía SQL desde la vista QSYS2.JOBLOG_INFO.