Provided by: manpages-posix_2.16-1_all bug

NAME

       wait - await process completion

SYNOPSIS

       wait [pid...]

DESCRIPTION

       When  an  asynchronous list (see Asynchronous Lists ) is started by the shell, the process ID of the last
       command in each element of the asynchronous list shall  become  known  in  the  current  shell  execution
       environment; see Shell Execution Environment .

       If  the  wait  utility  is  invoked  with  no  operands, it shall wait until all process IDs known to the
       invoking shell have terminated and exit with a zero exit status.

       If one or more pid operands are specified that represent known process IDs, the wait utility  shall  wait
       until  all  of  them  have  terminated.  If one or more pid operands are specified that represent unknown
       process IDs, wait shall treat them as if they were known process IDs that exited with  exit  status  127.
       The  exit  status  returned  by the wait utility shall be the exit status of the process requested by the
       last pid operand.

       The known process IDs are applicable only  for  invocations  of  wait  in  the  current  shell  execution
       environment.

OPTIONS

       None.

OPERANDS

       The following operand shall be supported:

       pid    One of the following:

               1. The unsigned decimal integer process ID of a command, for which the utility is to wait for the
                  termination.

               2. A  job control job ID (see the Base Definitions volume of IEEE Std 1003.1-2001, Section 3.203,
                  Job Control Job ID) that identifies a background process group  to  be  waited  for.  The  job
                  control  job  ID  notation  is  applicable  only  for invocations of wait in the current shell
                  execution environment; see Shell Execution Environment . The exit  status  of  wait  shall  be
                  determined by the last command in the pipeline.

              Note:
                     The  job  control  job  ID  type  of  pid  is only available on systems supporting the User
                     Portability Utilities option.

STDIN

       Not used.

INPUT FILES

       None.

ENVIRONMENT VARIABLES

       The following environment variables shall affect the execution of wait:

       LANG   Provide a default value for the internationalization variables that are unset or  null.  (See  the
              Base  Definitions  volume of IEEE Std 1003.1-2001, Section 8.2, Internationalization Variables for
              the  precedence  of  internationalization  variables  used  to  determine  the  values  of  locale
              categories.)

       LC_ALL If  set  to  a  non-empty  string value, override the values of all the other internationalization
              variables.

       LC_CTYPE
              Determine the locale for the interpretation of sequences of bytes of text data as characters  (for
              example, single-byte as opposed to multi-byte characters in arguments).

       LC_MESSAGES
              Determine  the locale that should be used to affect the format and contents of diagnostic messages
              written to standard error.

       NLSPATH
              Determine the location of message catalogs for the processing of LC_MESSAGES .

ASYNCHRONOUS EVENTS

       Default.

STDOUT

       Not used.

STDERR

       The standard error shall be used only for diagnostic messages.

OUTPUT FILES

       None.

EXTENDED DESCRIPTION

       None.

EXIT STATUS

       If one or more operands were specified, all of them have terminated or were not  known  by  the  invoking
       shell,  and  the status of the last operand specified is known, then the exit status of wait shall be the
       exit status information of the command indicated by the last operand specified. If the process terminated
       abnormally due to the receipt of a signal, the exit status  shall  be  greater  than  128  and  shall  be
       distinct  from  the  exit status generated by other signals, but the exact value is unspecified. (See the
       kill -l option.) Otherwise, the wait utility shall exit with one of the following values:

           0  The wait utility was invoked with no operands and all process IDs known by the invoking shell have
              terminated.

       1-126  The wait utility detected an error.

         127  The command identified by the last pid operand specified is unknown.

CONSEQUENCES OF ERRORS

       Default.

       The following sections are informative.

APPLICATION USAGE

       On most implementations, wait is a shell built-in. If it is called in  a  subshell  or  separate  utility
       execution environment, such as one of the following:

              (wait)
              nohup wait ...
              find . -exec wait ... \;

       it returns immediately because there are no known process IDs to wait for in those environments.

       Historical  implementations of interactive shells have discarded the exit status of terminated background
       processes before each shell prompt. Therefore, the status of background processes was usually lost unless
       it terminated while wait was waiting for it. This could be a serious problem when a job that was expected
       to run for a long time actually terminated quickly with a syntax or initialization error because the exit
       status  returned  was  usually  zero  if  the  requested  process  ID  was  not  found.  This  volume  of
       IEEE Std 1003.1-2001  requires  the  implementation to keep the status of terminated jobs available until
       the status is requested, so that scripts like:

              j1&
              p1=$!
              j2&
              wait $p1
              echo Job 1 exited with status $?
              wait $!
              echo Job 2 exited with status $?

       work without losing status on any of the jobs. The shell is allowed to discard the status of any  process
       if  it  determines  that the application cannot get the process ID for that process from the shell. It is
       also required to remember only {CHILD_MAX} number of processes in this way. Since the only way to get the
       process ID from the shell is by using the '!' shell parameter, the shell is allowed to discard the status
       of an asynchronous list if "$!" was not referenced before another asynchronous list  was  started.  (This
       means that the shell only has to keep the status of the last asynchronous list started if the application
       did not reference "$!" . If the implementation of the shell is smart enough to determine that a reference
       to "$!" was not saved anywhere that the application can retrieve it later, it can use this information to
       trim  the  list of saved information.  Note also that a successful call to wait with no operands discards
       the exit status of all asynchronous lists.)

       If the exit status of wait is greater than 128, there is no way  for  the  application  to  know  if  the
       waited-for process exited with that value or was killed by a signal. Since most utilities exit with small
       values,  there  is seldom any ambiguity. Even in the ambiguous cases, most applications just need to know
       that the asynchronous job failed; it does not matter whether it detected  an  error  and  failed  or  was
       killed and did not complete its job normally.

EXAMPLES

       Although  the  exact  value  used when a process is terminated by a signal is unspecified, if it is known
       that a signal terminated a process, a script can still reliably determine which signal by using  kill  as
       shown by the following script:

              sleep 1000&
              pid=$!
              kill -kill $pid
              wait $pid
              echo $pid was terminated by a SIG$(kill -l $?) signal.

       If the following sequence of commands is run in less than 31 seconds:

              sleep 257 | sleep 31 &
              jobs -l %%

       either of the following commands returns the exit status of the second sleep in the pipeline:

              wait <pid of sleep 31>wait %%

RATIONALE

       The  description  of  wait  does not refer to the waitpid() function from the System Interfaces volume of
       IEEE Std 1003.1-2001 because that would needlessly overspecify this interface. However, the wording means
       that wait is required to wait for an explicit process when it is given an argument  so  that  the  status
       information  of  other  processes  is  not  consumed.  Historical implementations use the wait() function
       defined in the System Interfaces volume  of  IEEE Std 1003.1-2001  until  wait()  returns  the  requested
       process  ID  or  finds  that the requested process does not exist. Because this means that a shell script
       could not reliably get the status of all background children if a second background job was ever  started
       before  the  first  job  finished,  it  is  recommended  that  the  wait utility use a method such as the
       functionality provided by the waitpid() function.

       The ability to wait for multiple pid operands was adopted from the KornShell.

       This new functionality was added because it is needed to determine the exit status  of  any  asynchronous
       list accurately. The only compatibility problem that this change creates is for a script like

              while sleep 60 do
                  job& echo Job started $(date) as $!  done

       which  causes  the  shell  to  monitor all of the jobs started until the script terminates or runs out of
       memory. This would not be a problem  if  the  loop  did  not  reference  "$!"  or  if  the  script  would
       occasionally wait for jobs it started.

FUTURE DIRECTIONS

       None.

SEE ALSO

       Shell  Command  Language  ,  kill()  , sh , the System Interfaces volume of IEEE Std 1003.1-2001, wait(),
       waitpid()

COPYRIGHT

       Portions of this text are reprinted and reproduced in electronic form from IEEE Std 1003.1, 2003 Edition,
       Standard for Information Technology -- Portable Operating System Interface (POSIX), The Open  Group  Base
       Specifications Issue 6, Copyright (C) 2001-2003 by the Institute of Electrical and Electronics Engineers,
       Inc  and  The  Open Group. In the event of any discrepancy between this version and the original IEEE and
       The Open Group Standard, the original IEEE and The Open Group  Standard  is  the  referee  document.  The
       original Standard can be obtained online at http://www.opengroup.org/unix/online.html .

IEEE/The Open Group                                   2003                                               WAIT(P)