A fairly common technique is to use an SQL database to contain a job-queue, as well as step-control, time-stamping and status logging related to each job. As the workers complete a step, they (in an SQL transaction ...) update the status table for the job that they are working on and perhaps alter their flow in some way. For user status-reporting, a simple polling loop will usually suffice (the reads also being done within a transaction so that the data being read is atomically correct).
There are a number of batch job scheduling frameworks available in CPAN for Perl.