Take the 2-minute tour ×
Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems.. It's 100% free, no registration required.

Given a commodity PC, we would like to use it to execute some tasks in the background round the clock.

Basically, we would like to have commands like:

add-task *insert command here*
list-tasks
remove-task(s)

The added tasks should simply be put in a queue and executed one after another in the background (keeping running after logout of the shell).

Is there any simple script/program that does this?

share|improve this question
add comment

3 Answers

up vote 4 down vote accepted

There's a standard batch command that does more or less what you're after. More precisely, batch executes the jobs when the system load is not too high, one at a time (so it doesn't do any parallelization). The batch command is part of the at package.

echo 'command1 --foo=bar' | batch      
echo 'command2 "$(wibble)"' | batch
at -q b -l              # on many OSes, a slightly shorter synonym is: atq -q b
at -q b -r 1234         # Unschedule a pending task (atq gives the task ID)
share|improve this answer
add comment

There are lots of queuing systems, but the are frequently very specialized.

You might look into the at scheduler. It's like cron in some ways but it is setup more like a queue for one time jobs than for repeat jobs. It can "schedule" things on criteria other than time, such as system load or sequence of jobs.

Your favorite distro will almost certainly have packages for it.

share|improve this answer
add comment

Another solution is to use lpd, and create a custom "print driver" that runs your jobs. A friend helped me work this out when I had a similar request. Make a script like this, and put it in /tmp/batch.sh:

#!/bin/bash

TMPFILE=$(mktemp /tmp/XXXX)
exec <"$6"
cat - > $TMPFILE
chmod a+x $TMPFILE
$TMPFILE
rm -f $TMPFILE

Then run:

lpadmin -p batch1 -E -P /tmp/batch.sh

That starts a queue, and you can create more by using other names instead of batch1. Add a job with:

lp -d batch1 /path/to/jobscript

Manage jobs with lpq, lprm, and lpstat. If you want more flexibility with passing arguments to your jobs, you can make the batch.sh script fancier.

(I tried batch before going down this route, but either it doesn't work as a queue on OSX, or I was using it wrong.)

share|improve this answer
    
I realize that @arnaud specified "commodity PC," which means it's probably not OSX, where I tested this solution. However, this should be portable, and it's much more flexible than batch. –  Joe Fusion Jan 28 at 19:35
add comment

Your Answer

 
discard

By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.