Un programma che stampa non parla con una stampante. Apre un file di stampa, e se il suo
parametro SPOOL lo dice, il sistema mette l'uscita in un file di spool: un documento
che resta sul sistema finché qualcuno non lo stampa, lo converte o lo cancella.
Ne discendono due cose. La prima è che il documento esiste anche se la stampante non c'è: si può guardare a schermo, rimandare, spostare, salvare in PDF. La seconda è che il documento occupa disco, e resta lì finché qualcuno o qualcosa non lo toglie.
Come è organizzato
- Un file di spool è il singolo documento. Di solito ha il nome del file di stampa che
l'ha prodotto: il tasto Stampa produce
QSYSPRT. I dati stanno in membri di database della libreriaQSPL(oQSPLxxxxper un ASP). - Una coda di uscita (
*OUTQ) è un oggetto in una libreria, e raccoglie i file di spool. Quando si configura una stampante, il sistema le crea una coda predefinita in QUSRSYS. - Un writer è il lavoro che prende i documenti da una coda e li manda a una stampante. Gira nel sottosistema QSPL, che deve essere attivo. Senza writer avviato, la coda si riempie e non stampa nulla.
WRKSPLF
WRKOUTQ OUTQ(PRODLIB/STAMPE)
STRPRTWTR DEV(PRT01)
WRKWTR
In quale coda finisce un documento: se il file di stampa dice OUTQ(*JOB), nella coda del
job, che arriva dalla descrizione di job; se la descrizione di job dice *USRPRF, dal
profilo utente; e il profilo, a sua volta, può dire *WRKSTN, cioè la coda della stazione
di lavoro.
Nota
«la stampa non esce» ha tre cause da escludere in quest'ordine: il documento
non è mai stato prodotto (guardare il job log), il documento è in coda ma il writer non è
avviato (WRKWTR), oppure il documento è in un'altra coda. La catena qui sopra è il
motivo per cui la terza succede quando si cambia una descrizione di job o un profilo.
Che cosa si può fare a un documento
Un file di spool si identifica con nome, numero e job che lo ha prodotto, perché lo stesso job può produrne molti con lo stesso nome:
CHGSPLFA FILE(QSYSPRT) JOB(123456/MROSSI/FATTURE) SPLNBR(3) OUTQ(PRODLIB/RISTAMPE)
HLDSPLF FILE(QSYSPRT) JOB(123456/MROSSI/FATTURE) SPLNBR(3)
DLTSPLF FILE(QSYSPRT) JOB(123456/MROSSI/FATTURE) SPLNBR(3)
Il contenuto si legge anche in SQL, con SYSTOOLS.SPOOLED_FILE_DATA. Senza numero prende il
file con il numero più alto fra quelli con quel nome:
SELECT ORDINAL_POSITION, SPOOLED_DATA
FROM TABLE(SYSTOOLS.SPOOLED_FILE_DATA(
JOB_NAME => '123456/MROSSI/FATTURE',
SPOOLED_FILE_NAME => 'QSYSPRT',
SPOOLED_FILE_NUMBER => 3))
Perché il disco si riempie
I documenti non scadono da soli. Un rapporto notturno prodotto ogni giorno e mai cancellato è un archivio che cresce di 365 documenti l'anno, senza che nessuno abbia deciso di conservarli.
Vedere la situazione per utente, in documenti, pagine e kilobyte:
SELECT USER_NAME, COUNT(*) AS DOCUMENTI,
SUM(TOTAL_PAGES) AS PAGINE, SUM(SIZE) AS KB
FROM QSYS2.OUTPUT_QUEUE_ENTRIES
GROUP BY USER_NAME
ORDER BY KB DESC
SIZE è in kilobyte, TOTAL_PAGES in pagine. Le pagine sono l'unità in cui ragiona chi
decide se un rapporto va tenuto; i kilobyte sono quello che si recupera cancellando.
Le difese sono tre:
- La pulizia automatica.
GO CLEANUP, o il comandoCHGCLNUP, decide se la pulizia gira, a che ora, e da quanti giorni togliere messaggi, job log e stampe di sistema (SYSPRT). Per cambiarla servono*ALLOBJ,*SECADMe*JOBCTL. Da quando è attiva, i job log vanno nella coda QUSRSYS/QEZJOBLOG e i dump in QUSRSYS/QEZDEBUG: chi li cerca nella coda di prima non li trova più. - Una scadenza sui documenti. L'attributo
EXPDATE(con*DAYSeDAYS, da 1 a 366) dà a un file di spool una data dopo la quale è cancellabile, eDLTEXPSPLFcancella quelli scaduti. IBM suggerisce di farlo girare una volta al giorno con una voce dello scheduler. Così la conservazione diventa una regola scritta. - Non produrre quello che nessuno legge. Togliere un rapporto inutile vale più di qualunque pulizia, e va fatto chiedendo a chi lo riceve, non deducendo.
I documenti scaduti si vedono anche in SQL, perché OUTPUT_QUEUE_ENTRIES ha la colonna
EXPIRATION_DATE:
SELECT OUTPUT_QUEUE_NAME, USER_NAME, SPOOLED_FILE_NAME, EXPIRATION_DATE
FROM QSYS2.OUTPUT_QUEUE_ENTRIES
WHERE EXPIRATION_DATE < CURRENT DATE
Avvertenza
cancellando i file di spool, i membri di database che li contenevano
restano vuoti a disposizione dei documenti nuovi. Il valore di sistema QRCLSPLSTG dice
per quanti giorni: di serie 8, poi il sistema li cancella. IBM sconsiglia *NONE
(cancellarli subito), che aggiunge lavoro a ogni creazione di un file di spool e può
peggiorare molto le prestazioni. Per recuperare lo spazio subito c'è
RCLSPLSTG DAYS(*NONE). Sono i due soli modi ammessi di togliere quei membri dalle
librerie QSPL: IBM avverte che qualunque altro può causare problemi gravi.
Portare fuori un documento
- In PDF, con
CPYSPLF ... TOFILE(*TOSTMF) TOSTMF('/percorso/file.pdf') WSCST(*PDF): il file finisce sull'IFS, pronto da spedire. La conversione vale per i file di spool di tipo*SCSo*AFPDS. - In un file di testo, con
CPYSPLFverso un file fisico o un file dell'IFS senza conversione, quando il contenuto serve a un altro programma. IBM avverte che così una parte delle informazioni di stampa si perde o cambia. - Con ACS, scaricando il documento dall'interfaccia grafica, quando si tratta di uno solo.
Fonti
- IBM: Spooled files and output queues
- IBM: Create Job Description (CRTJOBD)
- IBM: Create User Profile (CRTUSRPRF)
- IBM: SPOOLED_FILE_DATA table function
- IBM: OUTPUT_QUEUE_ENTRIES view
- IBM: Change Cleanup (CHGCLNUP)
- IBM: Change Spooled File Attributes (CHGSPLFA)
- IBM: Delete Expired Spooled Files (DLTEXPSPLF)
- IBM: Automatically clean up unused printer output storage (QRCLSPLSTG)
- IBM: Reclaiming spooled file storage
- IBM: Copy Spooled File (CPYSPLF)
Commenti
Nessun commento ancora. Sii il primo a commentare!
Devi avere un account per commentare. Accedi · Registrati