Chapter 6: Printing and Managing Print Jobs

On this page…

    6: Printing and Managing Print Jobs

    Over the years, Linux has had several printing systems, including the venerable Line Printer Daemon (LPD) and LPR Next Generation (LPRng) that are still found in vestigial form on modern Linux distributions. In the past few years, however, most distributions have settled on CUPS (which formerly stood for the Common UNIX Printing System, but has since been shortened to just plain ol’ CUPS) as their backend of choice. CUPS is well supported, easy to use, modern, and a perfect drop-in replacement for LPD and LPRng. The same commands used with LPD and LPRng still work, but now they call functions in CUPS.

    This chapter focuses on CUPS because it is the printing system with which most Linux users work. This chapter does not cover how to set up and configure a printer. Most distributions now provide easy-to-use GUI configuration tools to do just that, so you’re going to focus on actually querying and using the printer via the command line.

    Linux Journal’s “Overview of Linux Printing Systems,” available at, provides an excellent look at the various options Linux users have today, with special focus on the current favorite, CUPS. For more on CUPS, see Linux Journal’s “The CUPS Printing System” at, a very good look at this essential technology. The best place to go for information about CUPS is, unsurprisingly, the CUPS Software Users Manual, which you can find at It’s long and sometimes obtuse, but full of valuable advice and help, and it’s an essential resource.

    List All Available Printers

    lpstat -p

    Before you can begin working with your printers, you need to know what makes up “your printers.” To find the printers configured on your system, use the lpstat command (short for line printer status) along with the -p option.

    $ lpstat -p
    printer bro is idle. enabled since Jan 01 00:00
    printer bro_websanity is idle. enabled since Jan 01 00:00
    printer wu_eads14 is idle. enabled since Jan 01 00:00

    As you can see, this system has three printers—bro, bro_websanity, and wu_eads14 (bro is short for Brother, the manufacturer of those printers)—and none of them are printing anything at the moment.

    Determine Your Default Printer

    lpstat -d

    You know all of your printers, thanks to running lpstat -p, but which one is the default? As you’re going to see soon, you can send a print job to a specific printer, or you can quickly send it to your default printer. To find out which printer is the default, use the lpstat command with the -d (for default) option.

    $ lpstat -d
    system default destination: bro

    Of course, if you only have one printer connected to your computer, you probably don’t need to run this command. But for laptop users who move around to different locations and who print to different printers, this command is essential.

    Find Out How Your Printers Are Connected

    lpstat -s

    Laptop users find this next command particularly helpful, as it tells them how they access the printers available to them. When you first set up a printer, you must specify how you connect to it. You have several choices:

    To find out what printers are configured for your computer and how you connect to those printers, use lpstat with the -s option.

    $ lpstat -s
    system default destination: bro
    device for bro: socket://
    device for bro_websanity: socket://
    device for wu_eads14: socket://

    In this case, every printer is a network printer, so it uses socket://, followed by the printer’s IP address and its port (9100 is standard for most networked printers, although you might see port 35 used as well). That’s pretty easy, but it can quickly get much more complicated.

    Although CUPS is user-friendly in many areas, it’s famously obtuse when it comes to the Uniform Resource Indicators (URIs) used to indicate the locations of printers vis-á-vis your Linux box. Table 6.1 lists each connection method and the type of URI you might see, which should help you understand the list of printers and URIs you see when you run lpstat -s.


    Assume that the printer in the following examples is named bro and located on the network at That isn’t relevant in every situation, of course. If the printer is connected via a parallel cable, its IP address doesn’t matter.

    Table 6.1: Printer Connections & CUPS URIs
    Parallel parallel:/dev/lp0
    Serial serial:/dev/ttyS1?baud=115200
    USB usb:/dev/usb/lp0
    Remote LPD queue lpd://
    SMB shared printer (Windows) smb://username:password@
    Network printer (TCP) socket://
    Remote CUPS server (IPP/HTTP) ipp://,
    Network printer with IPP (IPP/HTTP) ipp://,

    Thanks to the rise of network printing in the past several years, it’s getting simpler to connect to printers via socket, ipp, or http. Even so, you’re still going to run into legacy printers that require the older, more complicated connection methods, so it’s good to familiarize yourself with them.


    A bonus is that lpstat -s in essence duplicates the functionality of lpstat -p -d, as it lists all printers known by your system, as well as the default printer. If you want to know all that information quickly, this is a good command to use.

    Get All the Information About Your Printers at Once

    lpstat -t

    Now for the mighty command. The nice thing about using lpstat -p, lpstat -d, or lpstat -s is that you only get the precise bit of information you want. If you want everything all at once, however, use lpstat with the -t option, which dumps everything lpstat knows about your printers onto your shell.

    $ lpstat -t
    scheduler is running
    system default destination: bro
    device for bro: socket://
    device for bro_websanity: socket://
    device for wu_eads14: socket://
    bro accepting requests since Jan 01 00:00
    bro_websanity accepting requests since Jan 01 00:00
    wu_eads14 accepting requests since Jan 01 00:00
    printer bro is idle.  enabled since Jan 01 00:00
    printer bro_websanity is idle.  enabled since Jan 01 00:00
    printer wu_eads14 is idle.  enabled since Jan 01 00:00

    You get it all: your default printer, a list of all printers known to your system, the connection methods and locations of those printers, and the status of all printers. The more printers you have configured on your computer, the longer this listing. For some of you, it will be overwhelming, so you might find that lpstat with one of the other options you’ve examined is a better choice.

    Print Files to the Default Printer


    Now that you know what printers are on your system, it’s time to actually use them to print something. Printing to your default printer (determined with lpstat -d) is easy.

    $ lpr Lovecraft_-_Call_of_Cthulhu.txt

    That’s it: Just lpr and the name of the text file. Pretty simple.


    You probably expect that you can print ASCII text files on the command line using CUPS, but it might surprise you to learn that you can also print PDFs or PostScript files. But that’s it; don’t try to print Word,, or any other kind of non-text-based or non-PostScript-based documents, or your printer will spew out pages of garbage!

    Print Files to Any Printer

    lpr -P

    Printing to the default printer, as shown in the previous section, is pretty easy. If you have more than one printer, however, and you want to print to one that is not the default, simply use the -P option, followed by the name of the printer.

    $ lpr -P bro_websanity Lovecraft_-_Call_of_Cthulhu.txt

    If you don’t know the names of your printers, use lpstat -p, as discussed previously in the “List All Available Printers” section.


    You’ll notice that the filename has underscores instead of spaces, which makes it much easier to deal with on the command line. If the filename has spaces in it, you have to use one of the following methods for referencing it:

    $ lpr -P bro_websanity "Lovecraft - Call of Cthulhu.txt"


    $ lpr -P bro_websanity Lovecraft\ -\ Call\ of\ Cthulhu.txt

    If the filename does have spaces, it’s probably easiest to use tab completion so you don’t have to type out the name yourself. For instance, you’d enter lpr -P bro_websanity Love and then press the Tab key, allowing bash to finish the filename. For more on tab completion, see <>.

    Print More Than One Copy of a File

    lpr -#

    If you want to print more than one copy of document, use the -# (the pound sign) option, followed by the number of copies you want:

    $ lpr -# 2 -P printer Lovecraft_-_Call_of_Cthulhu.txt

    The number can range from 1 to 100. Want more than 100? Repeat the command. Or write a script. Or hire a professional printer!

    List Print Jobs


    If you have several jobs queued up to print, you might want to see that list. Perhaps you want to cancel one or more of the jobs (more on how to do that ahead, in the next few sections), you want to find out why a job is taking so long to print, or maybe you just want to know how many print jobs are in line. The lpq command (as in lp queue) lists all jobs currently printing on the default printer.

    $ lpq
    bro is ready and printing
    Rank   Owner Job File(s)                Total Size
    active scott 489 Lovecraft_-_Call_of_C 108544 bytes

    If you want to find out the status of print queues for all your printers, not just your default, simply append -a (as in all) after lpq:

    $ lpq -a
    Rank   Owner Job File(s)                Total Size
    active scott 489 Lovecraft_-_Call_of_C 108544 bytes
    1st    scott 490 ERB_-_A Princess_of_M 524288 bytes

    Keep in mind two things. First, the listing provided by lpq -a is cut off, so while the filenames are actually Lovecraft_-_Call_of_Cthulhu.txt and ERB_-_A Princess_of_Mars.txt, you don’t see the entire name because lpq only shows a certain number of characters.

    Second, and this is very important, lpq is not showing all the print jobs the printer knows about, only those that your machine knows about. From the printer’s perspective, the print queue might actually look like this:

    To find out the actual queue on the printer, you have to use whatever management utilities come with that device, which is far beyond the scope of this book.

    List Print Jobs by Printer


    The lpq command shows you the files that are queued to print, but it doesn’t tell you to which printer the files are being sent. To learn that, you need to use the lpstat command, covered earlier in “List All Available Printers.” This time, however, simply use lpstat without any options at all:

    $ lpstat
    bro-489           rsgranne  108544  Tue 10 Dec 2005 03:00:09 PM CST
    bro_websanity-490 rsgranne  524288  Tue 10 Dec 2005 03:05:05 PM CST

    The result is a list of print jobs, with the name of each printer handling the job at the beginning of each line. Did you accidentally send a job to a printer to which you’re not currently connected? Find out with lpstat and then delete the job, which you’ll learn in the next section.

    Cancel the Current Print Job Sent to the Default Printer


    Do you want to cancel the current print job being sent to your default printer? Just use lprm (as in lp remove):

    $ lprm

    Be sure to issue this command with haste. Many printers now are so fast and have so much memory that the job might have already left your machine and be running on the printer. In that case, find the Cancel button on your printer and press it quickly!

    Cancel a Print Job Sent to Any Printer

    lprm job ID

    In the previous section, you learned how to cancel the current print job going to the default printer. But what if the job is queued and won’t start for another few minutes? Or what if the job is heading for a printer that’s not the default? In those cases, you want to still use lprm, but you want to tell the command which job to cancel by referencing the job’s ID number.

    Look back at the examples in “List Print Jobs.” The third column is labeled “Job” and has a number in it. Now look back at “List Print Jobs by Printer.” After the name of each printer is a hyphen and then a number—the same number seen in “List Print Jobs.” That number is the job ID number. Specify that number to lprm, and that exact job will be removed.

    $ lpstat
    bro-489           rsgranne  108544  Tue 10 Dec 2005 03:00:09 PM CST
    bro_websanity-490 rsgranne  524288  Tue 10 Dec 2005 03:05:05 PM CST
    $ lprm 490
    $ lpstat
    bro-489           rsgranne  108544  Tue 10 Dec 2005 03:00:09 PM CST

    You can really save yourself from a needless waste of paper, toner, and ink using this particular command. Next time you realize that you just sent a 500-page document full of large pictures to your printer and stop it using lprm and a job ID number, send an email my way and thank me.

    Cancel All Print Jobs

    lprm -

    What if you have several print jobs you want to cancel? You could delete them all by specifying all of their job ID numbers, like this:

    $ lprm 489 490 491 492 493

    That’s too much typing, however. If you want to get rid of all print jobs you’ve queued on every printer, just follow lprm with a hyphen:

    $ lprm -

    It’s quick, it’s painless, and it’s lazy in the best Linux tradition. Nothing to be ashamed of there!


    Printing is a central activity people perform on their computers, so it’s important to learn how to print effectively. Part of printing is knowing how to query printers and jobs as well as send those jobs to printers in the first place. Of course, not all jobs need to be printed, so it’s important to know how to cancel unnecessary jobs as well. This chapter covers the major tasks you’ll need to work with your printers from within Linux, but let me leave you with a final bit of advice: Automatic duplex printers that work with Linux have now fallen in price drastically, and they’ll help you save a small fortune in paper. Check one out when you’re next in the market for a printer. You’ll be glad you did.

    WebSanity Top Secret