26165a70 |
1 | \cfg{man-identity}{after}{1}{2008-02-20}{Simon Tatham}{Simon Tatham} |
2 | |
92dccb8d |
3 | \define{dash} \u2013{-} |
4 | |
26165a70 |
5 | \title Man page for \c{after} |
6 | |
7 | \U NAME |
8 | |
92dccb8d |
9 | \c{after} \dash wait until an unrelated process has terminated |
26165a70 |
10 | |
11 | \U SYNOPSIS |
12 | |
13 | \c after [ -x | -z ] pid |
14 | \e bbbbb bb bb iii |
15 | |
16 | \U DESCRIPTION |
17 | |
18 | \c{after} lets you specify a process by its numeric PID, and then |
19 | waits until that process has terminated. If possible, it returns the |
20 | process's exit code as well. |
21 | |
22 | You might use \c{after} if you had started a long-running process in |
23 | one window and then realised that you should have told the shell to |
24 | do something else after it finished. For example, after typing |
25 | \cq{make} to begin a long build run, you suddenly realise you should |
26 | have typed \cq{make && ./runtests.sh}, so that you wouldn't have to |
27 | be physically present to kick off the test run after the build |
28 | completed, and so that you could take one long coffee break instead |
29 | of two short ones. In this situation you could use \c{after} to |
30 | solve your problem: use \cw{ps}(\e{1}) to look up the process ID of |
31 | the \cw{make} process, and then type a command such as \cq{after |
32 | 34530 && ./runtests.sh} in a second terminal window. |
33 | |
34 | The operation of waiting for an arbitrary process is not an easy one |
35 | on Unix, so the \c{after} command supports multiple methods of |
36 | achieving it and will try them in order until one works. Some |
37 | methods allow the exit code of the process to be retrieved, in which |
38 | case \c{after} will return the same value; others do not. |
39 | |
40 | \U OPTIONS |
41 | |
42 | \dt \cw{-x} |
43 | |
44 | \dd Restricts \c{after} to only attempting methods which retrieve |
45 | the process's exit code. These methods typically require \c{after} |
46 | and the target process to be running under the same user ID. If no |
47 | available method works, \c{after} will fail. |
48 | |
49 | \dt \cw{-z} |
50 | |
51 | \dd Causes \c{after} to always return 0 (success) after detecting |
52 | that the process has terminated, whether or not its exit code was |
53 | available. |
54 | |
55 | \U EXIT STATUS |
56 | |
57 | If it settles on a method which provides the target process's exit |
58 | code, \c{after} will return the same code itself (unless you disable |
59 | this with the \cw{-z} option). Hence, you can use the shell \cw{&&} |
60 | operator to run other commands which are conditional on the target |
61 | process succeeding (as in the example above). |
62 | |
63 | If it has to fall back to a method which does not provide the exit |
64 | code, \c{after} will return 0 (success) when the process terminates. |
65 | |
66 | If something goes so badly wrong that \c{after} was unable to |
67 | reliably wait for the process at all, it will return 127. |
68 | |
69 | \U BUGS |
70 | |
71 | There are not enough methods supported. |
72 | |
73 | The whole concept of \c{after} has an inherent bug in the form of a |
74 | race condition: if you're not careful, the target process could |
75 | terminate in between you looking up its PID and typing the \c{after} |
76 | command. If your process looks as if it might terminate within the |
77 | time it takes to type the command, it's probably better not to try |
78 | using \c{after} at all. |
79 | |
80 | \U LICENCE |
81 | |
82 | \c{after} is free software, distributed under the MIT licence. Type |
83 | \cq{after --licence} to see the full licence text. |
84 | |
85 | \versionid $Id$ |