Background Jobs and IO

   

Korn Shell: Unix and Linux Programming Manual, Third Edition, The
By Anatole Olczak

Table of Contents
Chapter 5.  Job Control


Background Jobs and I/O

Jobs being executed in the background will stop if they attempt to read input from your terminal. If you tried to interactively remove $PUBDIR/junk in the background, this is what would happen:

 $ rm  i $PUBDIR/junk &  [2]  +Stopped (tty input) rm  i $PUBDIR/junk & 

The job is stopped because it needs to prompt you for input. The rm i job is brought back into the foreground with the fg command and its prompt is displayed:

 $ fg %2  rm  i $PUBDIR/junk  rm: remove /usr/spool/uucppublic/junk? y 

By default, jobs send their output to your terminal, even while running in the background. Here, the find command sends its output to the terminal, even though it is running in the background:

 $ find /  name core  print &  [2]  1453  $ /usr/lbin/core  /home/anatole/bin/core 

That can be annoying, especially if you are in the middle of something else. To avoid this problem, redirect the output of background jobs to a file. Make sure to be careful with the redirection. If you don't redirect standard error, error messages will go to your terminal and not to the output file. Let's kill the find job, then restart it and send the output to c.out:

 $ kill %2  [2] + Terminated find /  name core  print>c.out &  $ find /  name core  print >c.out &  [2]  1453  $ jobs  [2] ?Runningfind /  name core  print &  [1]   Runningsleep 1000 & 

We can work on something else until we get the completion message.

 [2] +Done      find /  name core  print>c.out & 

Table 5.1. Job Control Commands

bg

put the current stopped job in the background

bg %n

put the stopped job n in the background

fg

move the current background job into the foreground

fg %n

move background job n into the foreground

jobs

display the status of all jobs

jobs l

display the status of all jobs along with their process ids

jobs p

display the process ids of all jobs

kill %n

kill job n

kill l

list all valid signal names

kill ?/span>signal %n

send the specified signal to job n

set m, set o monitor

enable job control; execute background jobs in a separate process group, and report the exit status of background jobs

stty tostop

prevent background jobs from generating output

stty tostop

allow background jobs to generate output (default)

wait

wait for all background jobs to complete

wait %n

wait for background job n to complete

Ctl-z

stop the current job

There are other ways to deal with job output. Jobs being executed in the background are prevented from generating output by setting stty tostop. Let's run the find job again with the tostop option enabled:

 $ stty tostop  $ find /  name core  print &  [2]  1460 

Now when the job has some output, we get this message:

 [1] + Stopped(tty output) find /  name core  print & 

The only way to see the find output is to bring the job back into the foreground.

 $ fg  /usr/lbin/core  /home/anatole/bin/core 

The stty tostop command can be put into your profile file so that background job output is by default disabled.

The nohup command can also be used to direct output from background jobs. It causes standard output and standard error to be automatically sent to nohup.out, or whatever file you give it. One added benefit: the nohup command will keep jobs running, even if you log out. Here we run the find job again using nohup. First we need to enable background job output:

 $ stty  tostop  $ nohup find /  name core  print &  [2] 1469  $ wait  Sending output to 'nohup.out'  [2] + Done    nohup find /  name core  print & 

The find job output is in nohup.out:

 $ cat nohup.out  /usr/lbin/core  /home/anatole/bin/core 

       
    Top
     



    Korn Shell. Unix and Linux Programming Manual, Third Edition
    Korn Shell. Unix and Linux Programming Manual, Third Edition
    ISBN: N/A
    EAN: N/A
    Year: 2000
    Pages: 177

    flylib.com © 2008-2017.
    If you may any questions please contact us: flylib@qtcs.net