From be26a2cdba2f9229bdfee30770fd18c6841c1bc5 Mon Sep 17 00:00:00 2001 From: "Richard W.M. Jones" Date: Tue, 21 Feb 2012 19:14:42 +0000 Subject: [PATCH] Update whenjobs(1) manual page reference section. --- tools/whenjobs.pod | 329 ++++++++++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 325 insertions(+), 4 deletions(-) diff --git a/tools/whenjobs.pod b/tools/whenjobs.pod index 99c38cf..5a9ac72 100644 --- a/tools/whenjobs.pod +++ b/tools/whenjobs.pod @@ -130,7 +130,7 @@ source, eg: =item B<--set> variable value -=item B<--type> bool|int|float|string +=item B<--type> bool|int|float|string|unit I<--set> sets the variable named C to the new C. The variable is created if it does not already exist. Note that setting a @@ -140,9 +140,8 @@ To unset a variable, set it to the empty string: whenjobs --set var "" -By default variables are untyped (more precisely, they are treated as -strings). You can also set the type of a variable when setting it by -adding the optional I<--type> parameter: +By default variables are strings. You can also set the type of a +variable when setting it by adding the optional I<--type> parameter: whenjobs --set free_space 10000 --type int @@ -176,6 +175,328 @@ Display brief usage and exit. =head1 REFERENCE +A whenjobs file consists of a series of one or more "every" or "when" +statements. + +Comments in the file can be written using C<(* ... *)>. Comments +may be nested. + +Shell script fragments are written using CE ... EE>. +Within shell script fragments, use C<#> for comments (as in ordinary +shell scripts). Because CE> has a special meaning, it +cannot be used in the shell script (ie. for redirection). You have to +write C\E> instead which is replaced with CE> when +the shell script is parsed. + +=head2 EVERY STATEMENTS (PERIODIC JOBS) + +An every statement has the form: + + every : + << + # shell script + >> + +where CperiodE> is a I, which may take +one of the forms below. Don't forget the colon character between the +period expression and the shell script. + +An every statement is a job which runs periodically. + +=head3 PERIOD EXPRESSIONS + +=over 4 + +=item B + +The job runs every second. + +=item B + +The job runs every minute. + +=item B + +The job runs every hour. + +=item B + +The job runs every day, at midnight UTC. + +=item B + +The job runs every week, on a Thursday at midnight UTC. + +=item B + +The job runs every month, on the first of the month at midnight UTC. + +=item B + +The job runs every year, on the first day of the year at midnight UTC. + +=item B + +=item B + +=item B + +The job runs every 10, 100 or 1000 years. + +=item B seconds> + +The job runs every I seconds (I is any number E 1). + +=item B minutes> + +The job runs every I minutes. + +=item B hours> + +The job runs every I hours. + +=item B days> + +The job runs every I days. + +=item B weeks> + +The job runs every I weeks. + +=item B months> + +The job runs every I months. + +=item B years> + +=item B decades> + +=item B centuries> + +=item B millenia> + +The job runs every I, I<10*N>, I<100*N> or I<1000*N> years. + +=back + +=head2 WHEN STATEMENTS (DEPENDENT JOBS) + +A when statement has the form: + + when : + << + # shell script + >> + +where CexprE> is a I, described below. +Don't forget the colon character between the period expression and the +shell script. + +A when statement is a job which runs when the conditions described in +its when-expression become true. + +When jobs are I. This means that they run when the +condition changes from false to true (or in the case where the +expression has not been evaluated before, when it evaluates initially +to true). + +=head3 WHEN EXPRESSIONS + +When expressions are fully recursive expressions constructed from the +following elements: + +=over 4 + +=item I B<&&> I + +=item I B<||> I + +The boolean "and" or "or" of the two sub-expressions. + +=item I B> I + +=item I B=> I + +=item I B<==> I + +=item I B=> I + +=item I B> I + +The two sub-expressions are evaluated and the usual comparison +operator is performed. + +If the sub-expressions are numeric, then numeric comparison is done. +If either sub-expression is non-numeric, then both expressions are +converted (if necessary) to strings and string comparison is done. + +=item B I + +Boolean negative of I. + +=item I B<+> I + +For numeric sub-expressions, this performs addition. + +If both sub-expressions are strings, this performs string +concatenation. + +Other types give an error. + +=item I B<-> I + +=item I B<*> I + +=item I B I + +=item I B I + +Both sub-expressions are evaluated, and if both are numeric, then the +result is subtraction, multiplication, division or modulo. + +Other types give an error. Note that I really is an infix +operator. + +=item I + +The value of the named variable. + +Previously undefined variables are automatically initialized to the +empty string. + +=item B I + +The I value of the named variable. This means, the value +that it had last time this when-job ran. + +If the when-job has not run yet, then this returns C<"">. + +=item B I + +If the named variable has changed since this job last ran, then this +evaluates to true, else false. + +This is the same as writing C. + +=item B I + +If the named variable has changed and increased since this job last +ran, then this evaluates to true, else false. + +This is the same as writing C variable>. + +=item B I + +If the named variable has changed and decreased since this job last +ran, then this evaluates to true, else false. + +This is the same as writing C variable>. + +B There is a subtle and difficult problem with using the +I operator: The first time the expression is evaluated, the +job has (by definition) not yet run. Therefore C +evaluates to C<""> (see definition of I above). Since +C<"" E everything>, the I operator evaluates to +false, and since this usually means the job does not run, the +operator always evaluates to false. A future version of whenjobs +will address this problem. + +=item B + +This evaluates to true the first time the expression is evaluated +after the jobs file has been reloaded or the daemon restarted. +Thereafter it evaluates to false. + +You can use this to initialize variables, but note that this does not +solve the I operator problem described above, because +variables are initialized too late to affect that. + +=item B + +=item B + +Constants that evaluate to boolean false or true respectively. + +=item I<"any string"> + +Any string. + +In a boolean context, the empty string evaluates to false, and +non-empty strings evaluate to true. + +=item I + +Any integer. (Arbitrarily large integers are supported.) + +In a boolean context, 0 evaluates to false, and non-zero evaluates to +true. + +=item I + +=item I<.N> + +=item I + +=item I + +Any floating point number. + +In a boolean context, 0 evaluates to false, and non-zero evaluates to +true. + +=back + +=head2 SHELL SCRIPTS + +The code between CE ... EE> is a shell script. It +is executed using C<$SHELL>, or if that environment variable is not +set then C. + +=head3 SHELL SCRIPT VARIABLES + +Every variable that has been set (using the whenjobs I<--set> option) +is exported to the script, so you can simply get the value of any +variable by writing C<$name>. + +In addition, there are some special variables available: + +=over 4 + +=item C<$JOBNAME> + +The name of the job. If the job has been named explicitly, then that +name is available through this variable, else it will be some implicit +name like C. + +=item C<$JOBSERIAL> + +The serial number of the job. This is simply a variable that +increments each time a job is run, and is unique to that run of the +job. + +=back + +Other environment variables such as C<$HOME>, C<$LOGNAME> etc are +available as normal. + +=head3 SHELL SCRIPT TEMPORARY CURRENT DIRECTORY + +The shell script runs with its current directory set to a temporary +directory. The temporary directory is removed when the shell script +exits. Therefore you can write temporary files here without worrying +about cleaning them up. + +If you want to store permanent state, then you have to save it to a +well-known directory, eg. C<$HOME>, C etc. + +=head3 SHELL SCRIPT USER + +The shell script runs as the ordinary user. It has no special +privileges. + + + + -- 1.8.3.1