Technical Capabilities
Having trouble finding what you need?
Get in touch with us, so we can answer your specific questions directly.
Get In Touch

VX/JSP – OpenVMS Print & Batch

Overview

VX/JSP is a source-compatible reimplementation of the OpenVMS job controller and print/batch queue manager for Linux. It reproduces the VMS spooling subsystem as a set of cooperating processes plus a linked runtime library, and it implements the two system services applications already call, SYS$SNDJBC for request submission and queue control and SYS$GETQUI for queue information queries, with the same function and item codes as on OpenVMS.

VX/JSP ships as an add-on to VX/DCL: the familiar verbs SUBMIT, PRINT, INITIALIZE/QUEUE, START/QUEUE, SET QUEUE and SHOW QUEUE are parsed by VX/DCL and lowered onto the VX/JSP services. Batch scripts, print jobs, forms and queue definitions migrate without changes, so organizations keep identical batch and print behaviour on Linux without rewriting code or retraining operators.

Architecture and components

VX/JSP is not a single binary. It is a multi-process spooling subsystem: a job-controller daemon, one queue-manager process per active queue, and a symbiont process per running job, plus a linked static library that exposes the OpenVMS queue, job and form on-disk formats through a C API and the SYS$SNDJBC and SYS$GETQUI system services. It runs as an add-on to VX/DCL: DCL verbs such as SUBMIT, PRINT, INITIALIZE/QUEUE, START/QUEUE and SHOW QUEUE are parsed by VX/DCL and lowered onto the VX/JSP API and services. The table maps each OpenVMS component to its VX/JSP process.

OpenVMS equivalentVX/JSP processRoleStatus
JOB_CONTROL (JBC)jspctlJob-controller daemon. Owns the master and queue-list files, spawns and reaps queue managers, and dispatches control requests.live
QUEUE_MANAGER (per queue)qmgrOne process per active queue. Schedules pending jobs, enforces the job limit, and starts symbionts.live
Print/batch symbiont (PRTSMB)pjobPer-job worker. Prints a file to a device, or executes a DCL command file for a batch job.live
SHOW QUEUE monitorqmonQueue, job and symbiont monitor. Text mode plus an optional X11/Qt GUI.live text GUI optional
Repair toolqfixInteractive repair of damaged queue and job records.live
Status probejspmgrOne-shot check that prints controller running or stopped state and the spool directory.live
Networked printing (LATSYM / TCP)libxrxsym, telnetsymLoadable Xerox device symbiont and a TCP terminal-server symbiont for printing over the network.live telnetsym built on demand
Privilege model. The controller must change uid and gid to run each job as its submitting user. On Linux this is handled either by installing the controller setuid root, or by granting the cap_setuid and cap_setgid capabilities to the queue manager and symbiont, rather than through the VMS privilege model.

Request flow

A DCL command enters through VX/DCL, which calls SYS$SNDJBC. The service builds a job stream and writes it into the jobs file, then signals the controller through a shared request record. The controller routes the request to the right queue slot and feeds the queue's qmgr over a FIFO; the queue worker then starts a pjob symbiont to run the job.

01SUBMIT or PRINTVX/DCL parses the verb, qualifiers, and parameters.
02SYS$SNDJBCBuilds the job stream and writes its record to the .JOBS file.
03jspctl controllerA shared RequestRecord signals the controller, which routes the request to QueueControl.
04qmgr queue workerThe controller sends the queue request over its FIFO and start_job selects the work.
05pjob symbiontA per-job worker starts and follows the print or batch branch.
Print branchPrint fileThe symbiont sends the queued file to the configured output device.
Batch branchExecute command procedureThe symbiont runs the queued .COM file through VX/DCL.

Process lifecycle

The three daemons share one fixed startup pattern. Each of jspctl, qmgr and pjob runs the same six phases in order: initialise, open the log, attach the spool area, start, enter the main loop, and finalise on shutdown.

Queue files and data model

VX/JSP recreates the OpenVMS queue database as flat, fixed-record, packed files under the spool directory (SYS$SPOOL:[jsp] by default). There is no RMS on Linux, so records are accessed directly and locked with fcntl record locks. Each VMS queue-database file maps to a VX/JSP file with the same role.

OpenVMS fileVX/JSP fileHolds
QMAN$MASTER.DATQMAN$MASTERCluster and manager master record.
Controller channelQMAN$JSPCTLController request endpoint.
Queue listQMAN$QUEUESOne queue record per queue.
Form listQMAN$FORMSOne form record per form.
Per-queue managerQMAN$MANAGERLive queue-manager state for the queue.
Per-queue jobsQMAN$JOBSOne job record per queue entry.

Records

The three core record classes preserve the OpenVMS field semantics so that queue, job and form attributes survive migration byte for byte:

  • Queue record. Carries the queue name, node name and server address, the process id, manager and queue status flags, default and mounted form numbers, job count and job limit, base, standard and active priorities, owner, device, processor and library names, a generic-queue routing list, and a description.
  • Job record. Carries the entry number (which replaces the VMS job id), job status and flags, the VMS exit status, submitting user uid and gid, form number, copy count, page ranges, up to eight DCL parameters, submit, after and until times, the log file and working directory, and a per-file array (up to 16 files per job) with each file's name, status, page range and copy counts.
  • Form record. Carries the form number, length and width, top, bottom, left and right margins, flags, description, page-setup and setup names, and stock.

Job record state byte

The state byte on each job record tracks where the entry is in its lifecycle.

SymbolValueMeaning
QMGR_VIRGIN0x00Free / unused record.
QMGR_REQUEUED0xfbRequeued job.
QMGR_CHECK0xfcNeeds an operator-message check.
QMGR_STOPPED0xfdStopped.
QMGR_INUSE0xfeIn use.
QMGR_DELETED0xffDeleted.
Record locking. Queue and job records are read and updated in place under fcntl locks with explicit wait, no-wait, for-update and for-owning options, so concurrent queue managers and clients coordinate the same way VMS coordinated access to the queue database.

SYS$ system services

Applications that already drive OpenVMS queues call two system services, and VX/JSP implements both with VMS-compatible function and item code tables. Existing calls link and run without API changes; the COBOL SYS$ wrappers forward to the same runtime entry points.

SYS$SNDJBC and SYS$SNDJBCW

SYS$SNDJBC sends a request to the job controller: it submits and controls jobs, and creates, alters and controls queues. Requests carry a function code plus an item list. The service supports the full VMS function range; the operation codes below are a representative subset of those implemented.

CodeOperationCodeOperation
1ABORT_JOB18DELETE_QUEUE
2ADD_FILE19ENTER_FILE
3ALTER_JOB20MERGE_QUEUE
4ALTER_QUEUE21PAUSE_QUEUE
5ASSIGN_QUEUE22RESET_QUEUE
9CLOSE_JOB24START_QUEUE
10CREATE_JOB25START_QUEUE_MANAGER
11CREATE_QUEUE27STOP_QUEUE
13DEFINE_CHARACTERISTIC28STOP_QUEUE_MANAGER
14DEFINE_FORM29SYNCHRONIZE_JOB
16DELETE_FORM35DISABLE_QUEUE
17DELETE_JOB36ENABLE_QUEUE

Input item codes cover the job and queue attributes an application sets when submitting or altering work, such as after-time, base priority, batch flag, characteristic name, checkpoint data and command-language interpreter. Return status uses the standard VMS JBC$ status codes, for example normal completion, invalid function code, invalid item code and empty job.

SYS$GETQUI and SYS$GETQUIW

SYS$GETQUI queries queue, job, file and form information. It supports ten function codes over a large item-code space, and this is the service behind SHOW QUEUE and the qmon monitor.

CodeFunction
1CANCEL_OPERATION - cancel a wildcard operation.
2DISPLAY_CHARACTERISTIC
3DISPLAY_FILE
4DISPLAY_FORM
5DISPLAY_JOB
6DISPLAY_QUEUE
7TRANSLATE_QUEUE
8DISPLAY_ENTRY
9DISPLAY_QMAN
10DISPLAY_MANAGER
Source compatibility. Because the function codes, item codes and status values match OpenVMS, an application that calls SYS$SNDJBC or SYS$GETQUI for queue and job control keeps working after migration without any change to its service calls.

DCL command surface

VX/JSP is driven entirely through VX/DCL verbs, so the queue commands operators already know work unchanged. All major VMS queue-management commands are supported, and no syntax changes are required for migrated workloads.

CommandDescription
INITIALIZE/QUEUEInitialize a new queue.
DEFINE/FORMSet up form definitions (margins, stock, page setup).
START/QUEUEStart a queue.
START/QUEUE/MANAGERStart the queue manager.
SUBMITSubmit a batch job.
PRINTSubmit a print job.
SET QUEUE / SET/ENTRYModify queue attributes or a queued entry.
SHOW QUEUE / SHOW QUEUE/FORMDisplay queue or form status.
DELETE/ENTRYRemove a job from the queue.
DELETE/FORM, DELETE/QUEUERemove a form or a queue.
STOP/QUEUE (/ABORT, /ENTRY, /MANAGER)Stop a queue, abort work, stop an entry, or stop the manager.
SYNCHRONIZEWait for a job to complete.

Qualifiers

The queue and job commands carry the OpenVMS qualifier sets, covering print, batch and queue/form definition. The source-visible qualifiers include:

  • INITIALIZE/QUEUE: /BASE_PRIORITY, /BATCH, /BURST, /DEFAULT, /FEED, /FORM, /FORM_MOUNTED, /JOB_LIMIT, /ON, /PRIORITY, /START, /STOCK, /TRAILER.
  • PRINT: /AFTER, /COPIES, /DELETE, /FEED, /FORM, /HEADER, /HOLD, /NOTIFY, /PRIORITY, /QUEUE, /SETUP, /STOCK, /TRAILER.
  • SUBMIT: /AFTER=time, /DELETE, /HOLD, /[NO]KEEP, /NOTIFY, /PARAMETERS=(p1..p8), /PRINTER[=queue], /QUEUE=queue (default SYS$BATCH).

Worked example: submit a batch job

Submitting a DCL command file and checking its status, using the site's demo batch queue:

$ submit/notify/queue=sys$batch/print/nokeep FUNDS_TRANSFER.COM
  Job FUNDS_TRANSFER.COM pending on SYS$BATCH, entry 2
$
$ show queue/full/all sys$batch
Batch queue SYS$BATCH, running
    /PRIORITY=0  /NOENABLE_GENERIC
    /JOB_LIMIT=1
Jobname               Username   Entry   Status
-------               --------   -----   ------
FUNDS_TRANSFER.COM    batchop        2   executing

Job FUNDS_TRANSFER.COM (queue SYS$BATCH, entry 2) completed.
$

Sample queue display output

VX/JSP retains the VMS queue listing format, so operators see familiar output. The qmon monitor prints queues (Q:) and jobs (J:) with their record numbers, process ids, owners and status:

                                           --- locks ---
    rec#  job# name                    pid    own    upd status
Q:     0     0 JSPCTL                18053  18053      0 running - available jobs 0 max 0
Q:     1     1 SYS$BATCH             18056  18056      0 running - idle,available jobs 5 max 5
J:     6     6 EVENT_6               18283  18277      0 Executing    18277 00040001
J:    11    11 EVENT_11                  0      0      0 Pending          0 00040001
                                                          5 of 7 jobs executing
Q:     2     2 SYS$PRINT             18059  18059      0 running - idle,available jobs 1 max 1
   4 queue records, 14 job records, 6 executing

Print and batch symbiont

The pjob symbiont is the per-job worker. When a queue starts a job, the symbiont dispatches on the queue type: for a batch job it executes the DCL command file within VX/DCL; for a print job it runs the VMS page-formatting pipeline and sends the output to a device.

Batch path

A batch job runs its command file exactly as it did on OpenVMS. The original DCL syntax is retained, so existing .COM procedures migrate without modification. Submitting users' uid and gid are honoured, queue priorities and scheduling intervals control execution, and a single queue can run multiple jobs at once up to its job limit.

Networked printing

Printing to physical devices maps VMS devices to their Linux equivalents. Jobs can print to locally connected devices or spoolers, to direct printer connections, or to mapped network printers. A print-device layer handles host and port connections with PCL and PJL detection, and dedicated symbionts cover terminal-server (telnet) and Xerox devices.

TargetMechanism
Local device or spoolerDirect file or device output from pjob.
Network printer (raw)TCP connection to the device, default port 9100, with PCL/PJL support.
Terminal-server printertelnetsym prints over TCP to a telnet terminal server.
Xerox devicelibxrxsym loadable device symbiont.

Forms

Forms are first-class: DEFINE/FORM records margins, length, width, stock and page-setup names, and the form_read tool dumps form records for inspection. Queues carry a default and a mounted form, so form-based print layouts migrate with the queue definitions that reference them.

Compatibility and divergences

The core spooling subsystem is complete and source-compatible. The matrix summarises what is live today and where behaviour is scoped or still maturing.

CapabilityStatus
Job-controller daemon (jspctl)live
Per-queue manager and scheduler (qmgr)live
Print and batch symbiont (pjob)live
SYS$SNDJBC / SYS$SNDJBCWlive
SYS$GETQUI / SYS$GETQUIWlive
COBOL SYS$ wrapperslive
DCL commands (SUBMIT, PRINT, SHOW QUEUE, and more)live
Forms (DEFINE/FORM, margins, stock)live
Networked printing (TCP 9100, PCL, PJL)live
Xerox device symbiontlive
Terminal-server (telnet) symbiontbuilt on demand
Queue and job monitor GUI (qmon)live text GUI optional (X11/Qt)
Queue-record repair (qfix)live
Generic / logical queue routingpartial
Cluster / multi-node queuesfields present, clustering not enabled

Divergences from OpenVMS

VX/JSP preserves external behaviour while substituting Linux facilities for VMS internals where there is no direct equivalent.

OpenVMS mechanismVX/JSP on Linux
RMS QMAN$*.DAT filesFlat, fixed-record, packed files under the spool directory, accessed directly and fcntl-locked.
VMS job id (jid)Job entry number that preserves external entry semantics without the VMS internal encoding.
VMS privilege modelsetuid-root controller, or cap_setuid/cap_setgid capabilities, to run jobs as the submitting user.
VMS mailbox IPCFIFOs plus a shared request record between controller, queue managers and symbionts.
Single-threaded VMS queue managerPOSIX-threaded queue worker (up to 300 active jobs).
LAT / LATSYM printingTCP terminal-server printing plus raw-9100 and PCL device output.
DECwindows SHOW QUEUE UIX11/Xt (optionally Qt) qmon monitor.

Quick reference

Processes and tools

jspctl (controller)
qmgr (per queue)
pjob (symbiont)
qmon (monitor)
qfix (repair)
jspmgr (status probe)
form_read (form dump)
telnetsym (TCP printing)
libxrxsym (Xerox)

Queue files (spool directory)

QMAN$MASTER
QMAN$QUEUES
QMAN$FORMS
QMAN$JSPCTL
QMAN$MANAGER
QMAN$JOBS

System services

  • SYS$SNDJBC / SYS$SNDJBCW - submit and control jobs; create and control queues.
  • SYS$GETQUI / SYS$GETQUIW - query queue, job, file and form information (10 function codes).

Key DCL verbs

INITIALIZE/QUEUE
START/QUEUE
START/QUEUE/MANAGER
SUBMIT
PRINT
SET QUEUE
SET/ENTRY
SHOW QUEUE
DEFINE/FORM
DELETE/ENTRY
STOP/QUEUE
SYNCHRONIZE

Limits

LimitValue
Files per job16
DCL parameters per job8
Active jobs per queue300
Scheduled jobs10000
Queue name length32
Job name length48

Build and install

VX/JSP builds with the standard Linux toolchain: g++ and gcc, POSIX threads, fcntl record locks and BSD sockets, with an optional X11/Xt (or Qt) build for the qmon GUI. Install places the controller and workers setuid root, or grants the equivalent Linux capabilities.

Frequently Asked Questions

Curious about how Sector7 can facilitate your application migration? Explore our FAQs for expert insights.

What is VX/JSP and how does it help with OpenVMS migration?

VX/JSP is a source-compatible reimplementation of the OpenVMS job controller and print/batch queue manager for Linux. It reproduces the VMS spooling subsystem and implements the SYS$SNDJBC and SYS$GETQUI system services, so batch scripts, print jobs, forms and queue definitions migrate without code rewrites or operator retraining.

Which VMS queue management API calls does VX/JSP support?

VX/JSP implements all major SYS$ API calls for queue management including SYS$GETQUI, SYS$GETQUIW, SYS$SNDJBC, and SYS$SNDJBCW.

How does VX/JSP integrate with VX/DCL?

VX/JSP operates as an add-on module for VX/DCL, providing fully integrated command-line execution for job and print queue management on Linux.

What batch job submission capabilities does VX/JSP provide?

VX/JSP enables batch job submission using the SUBMIT command, executing DCL command files within VX/DCL while maintaining original VMS syntax for no-modification migration.

How does VX/JSP handle print queue operations on Linux?

VX/JSP includes over 100 print qualifiers for advanced print job control, supporting features like restarting reports on specific pages, queue reordering, and job prioritization. The tool maps VMS devices to Linux equivalents, ensuring printer compatibility with both direct printer connections and mapped network printers.

Organizations like DuPont have successfully leveraged similar queue management capabilities during their system modernization projects.

Can VX/JSP execute multiple batch jobs simultaneously?

Yes, VX/JSP supports simultaneous multi-job execution on a single queue with configurable priorities and scheduling intervals for optimized performance.

What queue management commands are available in VX/JSP?

VX/JSP supports all major VMS queue management commands without syntax changes, including DEFINE, INITIALIZE/QUEUE, PRINT, SUBMIT, DELETE/ENTRY, SET QUEUE, SHOW QUEUE, START/QUEUE, and STOP/QUEUE. The tool retains the original VMS queue listing format for familiar queue management in migrated environments.

What are the key benefits of using VX/JSP for OpenVMS migration?

VX/JSP eliminates the complexity of migrating VMS batch and print job processing by providing identical functionality on Linux platforms. Organizations maintain their existing workflows without code rewrites or retraining, ensuring business continuity during migration.

The tool delivers full compatibility with VMS batch and print queue commands, implements all major SYS$ queue management API calls, and supports advanced print and job scheduling options. Companies like Telstra have achieved successful modernization while preserving critical operational processes.

To explore how VX/JSP can streamline your OpenVMS migration, contact us for a consultation.

Is VX/JSP a standalone product or part of VX/DCL?

It is an add-on module for VX/DCL. Batch and print queue management runs through VX/DCL's command-line execution, so SUBMIT and PRINT behave as they do on OpenVMS and no separate command environment is introduced.

Which SYS$ system services does VX/JSP implement?

VX/JSP implements the VMS queue-management services SYS$SNDJBC and SYS$SNDJBCW for request submission and queue control, and SYS$GETQUI and SYS$GETQUIW for queue, job, file and form queries. The function codes, item codes and status values match OpenVMS, so existing service calls keep working without API changes.

Which VMS queue commands can I keep using unchanged?

VX/JSP supports the major VMS queue-management commands, including INITIALIZE/QUEUE, START/QUEUE, START/QUEUE/MANAGER, SUBMIT, PRINT, SET QUEUE, SET/ENTRY, SHOW QUEUE, DEFINE/FORM, DELETE/ENTRY, STOP/QUEUE and SYNCHRONIZE. No syntax changes are required for migrated workloads.

How do I submit a batch job with VX/JSP?

Use the SUBMIT command through VX/DCL to execute a DCL command file. The original VMS syntax is retained, so existing batch scripts migrate with no modification, and you can set queue priorities and scheduling intervals to control execution.

Can VX/JSP run multiple batch jobs at once?

Yes. A single queue can run multiple jobs simultaneously up to its job limit, with queue priorities and scheduling intervals controlling how work is dispatched. The queue manager uses POSIX threads and supports a large number of active jobs per queue.

How does VX/JSP handle printing on Linux?

The print symbiont reproduces the VMS page-formatting pipeline, including forms, page geometry, burst and flag pages, setup modules and carriage-control fixup. Jobs can print to local devices or spoolers, to raw network printers over TCP with PCL and PJL support, or to terminal-server and Xerox devices, with VMS devices mapped to their Linux equivalents.

Do I have to rewrite my batch and print workflows to migrate off OpenVMS?

No. VX/JSP replicates VMS batch and print queue behaviour, including the same commands, SYS$ service calls and the familiar VMS queue listing format, so organizations can keep their existing workflows on Linux without code rewrites or retraining.

Transform Your Legacy Software Today!

Get In Touch
Unlock the potential of your legacy software with our expert migration services.