chiark / gitweb /
mtimeout.c: Restructure timeout handling to use explicit machine.
[misc] / hush.1.in
CommitLineData
c818aced
MW
1.TH hush 1 "14 December 2011" "Edgeware tools"
2.SH NAME
3hush \- run a program, quietly unless it fails
4.SH SYNOPSIS
5.B hush
6.RB [ \-d
7.IR directory ]
8.RB [ \-m
9.IR email-address ]
10.RB [ \-n
11.IR maxlog ]
12.RB [ \-u
13.IR owner ][\fB: group ]
14.br
15 \c
16.I tag
17.I command
18.IR arguments ...
19.SH DESCRIPTION
20The
21.B hush
22program runs a command. The command's output (i.e., what it writes to
23its standard output and standard error file descriptors) is always
24logged to a file. If the command succeeds,
25.B hush
26itself outputs nothing; if it fails, then
27.B hush
28either writes the command's output to its own stdout, or sends it via
29email. It is intended to be used when running noisy programs via
30.BR cron (8),
31to reduce the amount of uninteresting mail (`cronspam') produced by an
32essentially working system.
33.PP
34The following command-line options are recognized.
35.TP
36.B \-h
37Write a help message describing
38.BR hush 's
39command line options and usage to standard output, and exit.
40.TP
41.B \-v
42Write
43.BR hush 's
44version number to standard output, and exit.
45.TP
46.BI "\-d " directory
47Write log files to
48.I directory
49rather than the default,
50.BR "@logdir@" .
51.TP
52.BI "\-m " email-address
53Rather than writing its output to stdout if the command fails, send the
54command's output to
55.IR email-address .
56and exit with status 0. (This is perhaps a surprising choice, but it
57prevents the caller from taking additional action to report a problem
58which has already been escalated to a human.)
59.TP
60.BI "\-n " maxlog
61If necessary, delete old logfiles so that no more than
62.I maxlog
63log files are left.
64.TP
65.BI "\-p " mode
66Set the permissions on the logfile to
67.I mode ,
68a mode specification acceptable to
69.BR chmod (1), though relative permissions will be applied to mode
70.B 600
71(i.e.,
72.BR u=rw,og= ).
73.TP
74.BI "\-u \fR[" user\fR][ : group\fR]
75Set the ownership and/or group of the logfile. If the
76.I user
77is specified, then the file's owner is set; if the
78.I group
79is specified, the file's group is set. (Some care is taken to ensure
80that the file is never available to members of the wrong group.)
81.SS Operation
82The given
83.I command
84is executed with the
85given
86.IR arguments ,
87with stdin redirected from
88.BR /dev/null ,
89and stdout and stderr redirected to separate pipes. If it is available,
90.BR stdbuf (1)
91is used to ensure that the
92.IR command 's
93stdout is line-buffered.
94.PP
95The
96.IR command 's
97output is collected in a log file named
98.IB logdir / tag . date # seq
99where
100.TP
101.I logdir
102is the argument of the
103.B \-d
104option, or
105.B @logdir@
106by default;
107.TP
108.I tag
109is the
110.I tag
111string given to
112.B hush
113as a command-line argument;
114.TP
115.I date
116is the current date, in ISO8601 form (in local time); and
117.TP
118.I seq
119is a sequence number, chosen to ensure that log file names are distinct
120and sort in chronological order.
121.PP
122The log file begins with a header giving the exact start time (in local
123time, with an offset from UTC) and a brief summary of the log format; it
124ends with another timestamp and the
125.IR command 's
126exit status. In between is the command's output. Lines written to
127stdout begin with
128.RB ` | ';
129lines to stderr begin with
130.RB ` * '.
131The two are interleaved in an attempt to help the reader identify how
132much progress the
133.I command
134had made when it encountered an error; however, because the streams are
135read asynchronously, this isn't perfect, and lines may appear earlier or
136later than they ought to.
137.PP
138If the
139.I command
140succeeds, as mentioned,
141.B hush
142exits without printing anything. If it fails, and the
143.B \-m
144option was given, the log file is mailed to the appropriate
145.I email-address
146with a subject line
147.IP
148.IB tag :
149.I command
150.B failed (status =
151.IB rc )
152.PP
153where
154.I rc
155is the
156.IR command 's
157exit status. If no
158.B \-m
159option was given, this log is simply written to standard output.
160.SH BUGS
161The stream interleaving isn't quite right, but it's hard to see how to
162improve it.
163.PP
164Capturing the command's output involves making a fairly large number of
165auxiliary processes and file descriptors. This is a bit ugly.
166.SH AUTHOR
167Mark Wooding, <mdw@distorted.org.uk>
168.SH SEE ALSO
169.BR cron (8).