1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345 |
- \input texinfo
- @c %**start of header
- @setfilename mcron.info
- @include config.texi
- @include version.texi
- @settitle mcron @value{VERSION}
- @c %**end of header
- @syncodeindex fn cp
- @copying This manual is for GNU mcron (version @value{VERSION}), which is a
- program for running jobs at scheduled times.
- Copyright @copyright{} 2003, 2005, 2006, 2012, 2014 Dale Mellor
- @quotation
- Permission is granted to copy, distribute and/or modify this
- document under the terms of the GNU Free Documentation License,
- Version 1.3 or any later version published by the Free Software
- Foundation; with no Invariant Sections, no Front-Cover Texts and
- no Back-Cover Texts. A copy of the license is included in the
- section entitled ``GNU Free Documentation License''.
- @end quotation
- @end copying
- @ifinfo
- @dircategory Individual utilities
- @direntry
- * mcron: (mcron). Run jobs at scheduled times.
- @end direntry
- @end ifinfo
- @titlepage
- @title mcron - Mellor's cron daemon
- @author Dale Mellor
- @page
- @vskip 0pt plus 1fill
- @c @insertcopying
- @end titlepage
- @contents
- @ifnottex
- @node Top, Introduction, (dir), (dir)
- @top mcron
- This file documents the @code{mcron} command (Mellor's cron) for
- running jobs at scheduled times.
- @c @insertcopying
- @end ifnottex
- @menu
- * Introduction:: Introducing mcron.
- * Simple examples:: How to use mcron 99.9% of the time.
- * Syntax:: All the possibilities for configuring cron jobs.
- * Invoking:: What happens when you run the mcron command.
- * Guile modules:: Incorporating mcron into another Guile program.
- * GNU Free Documentation License:: The license of this manual.
- * Index:: The complete index.
- @detailmenu
- --- The Detailed Node Listing ---
- Simple examples
- * Guile Simple Examples::
- * Vixie Simple Examples::
- Full available syntax
- * Guile Syntax::
- * Extended Guile examples::
- * Vixie Syntax::
- Extended Guile examples
- * AT commands::
- * Every second Sunday::
- * Two hours every day::
- * Missing the first appointment::
- * Penultimate day of every month::
- Vixie
- * Paul Vixie's copyright::
- * Crontab file::
- * Incompatibilities with old Unices::
- Detailed invoking
- * Invoking mcron::
- * Invoking cron or crond::
- * Invoking crontab::
- * Behaviour on laptops::
- * Exit codes::
- Guile modules
- * The base module:: The job list and execution loop.
- * The redirect module:: Sending output of jobs to a mail box.
- * The vixie-time module:: Parsing vixie-style time specifications.
- * The job-specifier module:: All commands for scheme configuration files.
- * The vixie-specification module:: Commands for reading vixie-style crontabs.
- @end detailmenu
- @end menu
- @node Introduction, Simple examples, Top, Top
- @chapter Introducing mcron
- @cindex introduction
- @cindex mcron
- The mcron program represents a complete re-think of the cron concept
- originally found in the Berkeley and AT&T unices, and subsequently
- rationalized by Paul Vixie. The original idea was to have a daemon
- that wakes up every minute, scans a set of files under a special
- directory, and determines from those files if any shell commands
- should be executed in this minute.
- The new idea is to read the required command instructions, work out
- which command needs to be executed next, and then sleep until the
- inferred time has arrived. On waking the commands are run, and the
- time of the next command is computed. Furthermore, the specifications
- are written in scheme, allowing at the same time simple command
- execution instructions and very much more flexible ones to be composed
- than the original Vixie format. This has several useful advantages
- over the original idea. (Changes to user crontabs are signalled
- directly to mcron by the crontab program; cron must still scan the
- /etc/crontab file once every minute, although use of this file is
- highly discouraged and this behaviour can be turned off).
- @cindex advantages of mcron
- @itemize @bullet
- @item
- Does not consume CPU resources when not needed. Many cron daemons only
- run jobs once an hour, or even just once a day.
- @item
- Can easily allow for finer time-points to be specified,
- i.e. seconds. In principle this could be extended to microseconds, but
- this is not implemented.
- @item
- Times can be more or less regular. For example, a job that runs
- every 17 hours can be specified, or a job that runs on the first
- Sunday of every month.
- @item
- Times can be dynamic. Arbitrary Guile (scheme) code can be provided to
- compute the next time that a command needs to be run. This could, for
- example, take the system load into consideration.
- @item
- Turns out to be easy to provide complete backwards compatibility with
- Vixie cron.
- @item
- Each user looks after his own files in his own directory. He can use
- more than one to break up complicated cron specifications.
- @item
- Each user can run his own daemon. This removes the need for suid
- programs to manipulate the crontabs, and eliminates many security
- concerns that surround all existing cron programs.
- @item
- The user can obtain an advance schedule of all the jobs that are due
- to run.
- @item
- Vixie cron is implemented in 4500 lines of C code; mcron is 2000 lines
- of scheme, despite the fact that it offers many more features and much
- more flexibility, and complete compatibility with Vixie cron.
- @end itemize
- A full discussion of the design and philosophy of mcron can be found
- in the white paper at
- @url{http://www.gnu.org/software/mcron/design.html}.
- @node Simple examples, Syntax, Introduction, Top
- @chapter Simple examples
- The vast majority of uses of cron are sublimely simple: run a program
- every hour, or every day. With this in mind the design of mcron has
- been to allow such simple specifications to be made easily. The
- examples show how to create the command descriptions, and subsequently
- how to run mcron to make them happen.
- @menu
- * Guile Simple Examples::
- * Vixie Simple Examples::
- @end menu
- @node Guile Simple Examples, Vixie Simple Examples, Simple examples, Simple examples
- @section Guile
- @cindex guile examples
- @cindex examples, guile
- @cindex example, run a program every hour
- You have an executable @code{my-program} in your home directory, which
- you want to run every hour. Create a file @code{job.guile} in
- directory @code{~/.config/cron} (this path may be altered by the
- @code{$XDG_CONFIG_HOME} environment variable) with the following
- contents
- @example
- (job '(next-hour) "my-program")
- @end example
- then run the command @code{mcron}.
- Want the program to run fifteen minutes past the hour, every two
- hours? Edit the file to read
- @example
- (job
- '(next-minute-from
- (next-hour (range 0 24 2))
- 15)
- "my-program")
- @end example
- and run the command @code{mcron}.
- Or, if you are not comfortable with Scheme, you could use (and see
- also the next section)
- @example
- (job "15 */2 * * *" "my-program")
- @end example
- and run the @code{mcron} command.
- If you want to run other jobs, you can either add more lines to this
- file, or you can create other files in your @code{.config/cron} directory
- with the @code{.guile} extension. Alternatively, you can use any file
- you want and pass it as an argument to @code{mcron}, or even pipe the
- commands into the standard input.
- @node Vixie Simple Examples, , Guile Simple Examples, Simple examples
- @section Vixie
- @cindex examples
- @cindex examples, vixie
- @cindex vixie examples
- You have an executable @code{my-program} in your home directory, which
- you want to run every hour. Create a file @code{job.vixie} in directory
- @code{~/.cron} with the following contents
- @example
- 0 * * * * my-program
- @end example
- then run the command @code{mcron}.
- @cindex vixie compatibility
- @cindex compatibility
- Alternatively (full compatibility with Vixie cron), set your
- environment variable @code{EDITOR} to your favorite editor, run
- @code{crontab -e}, put the above line into the edit buffer, save and
- exit. For this to work the @code{cron} daemon must be already running
- on your system, as root.
- @node Syntax, Invoking, Simple examples, Top
- @chapter Full available syntax
- @menu
- * Guile Syntax::
- * Extended Guile examples::
- * Vixie Syntax::
- @end menu
- @node Guile Syntax, Extended Guile examples, Syntax, Syntax
- @section Guile Syntax
- @subsection Job specification
- @cindex guile syntax
- @cindex syntax, guile
- @findex job
- In Guile-formatted configuration files each command that needs executing is
- introduced with the @code{job} function. This function always takes two
- arguments, the first a time specification, and the second a command
- specification. An optional third argument may contain a string to display
- when this job is listed in a schedule. Additionally a @var{user} keyword
- argument can be supplied to use a different user than the one defined in
- @code{configuration-user} global variable.
- @cindex time specification, procedure
- @cindex procedure time specification
- The first argument can be a procedure, a list, or a string. If a
- function is supplied, it must take exactly one argument, which will be
- the ``current'' time in UNIX format, and the return value of the
- function must be the time in UNIX format when this action should next
- be run. The following functions are available to facilitate the
- computation:
- @findex next-second-from
- @code{(next-second-from time . args)} without arguments this
- returns the second after the current one. With the extra arguments,
- these form a list of seconds in the minute when the action should run,
- and the function will return the time of the next allowed second
- (which may be in the next minute of the hour). @footnote{Note that
- while commands can be scheduled to run at any second, it is unlikely
- that they will be executed then but some time shortly thereafter,
- depending on the load on the system and the number of jobs that mcron
- has to start at the same time.}
- @findex next-minute-from
- @findex next-hour-from
- @findex next-day-from
- @findex next-week-from
- @findex next-month-from
- @findex next-year-from
- Similarly to @code{next-second-from}, there are also
- @code{next-minute-from}, @code{next-hour-from}, @code{next-day-from},
- @code{next-week-from}, @code{next-month-from}, @code{next-year-from}.
- @findex range
- Furthermore, the optional argument can be fulfilled by the function
- @code{(range start end . step)}, which will provide a list of values
- from start to (but not including) end, with the step if given. For
- example @code{(range 0 10 2)} will yield the list @code{'(0 2 4 6 8)}.
- @findex next-second
- @findex next-minute
- @findex next-hour
- @findex next-day
- @findex next-week
- @findex next-month
- @findex next-year
- @cindex time specification, list
- @cindex list time specification
- If the first argument to the @code{job} function is a list, it is
- taken to be program code made up of the functions @code{(next-second
- . args)}, @code{(next-minute...)}, etc, where the optional arguments
- can be supplied with the @code{(range)} function above (these
- functions are analogous to the ones above except that they implicitly
- assume the current time; it is supplied by the mcron base when the
- list is eval'd).
- @cindex time specification
- @cindex time specification, string
- @cindex string time specification
- @cindex time specification, vixie-style
- @cindex vixie-style time specification
- If the first argument to the @code{job} function is a string, it is
- expected to be a Vixie cron-style time specification. See the section
- on Vixie syntax for this.
- @cindex job execution
- @cindex command execution
- @cindex execution
- The second argument to the @code{(job)} function can be either a string, a
- list, or a function. The command is executed in the home directory and with
- the UID of @var{user}. If a string is passed, it is assumed to be shell
- script and is executed with the user's default shell. If a list is passed it
- is assumed to be scheme code and is eval'd as such. A supplied function
- should take exactly zero arguments, and will be called at the pertinent times.
- @subsection Sending output as e-mail
- @cindex email output
- @cindex email from guile script
- @cindex standard input to commands
- @findex with-mail-out
- When jobs are specified in a vixie-style configuration, the command is
- broken at a percentage sign, and the stuff that comes after this is
- sent into the command's standard input. Furthermore, any output from
- the command is mailed to the user. This functionality is provided for
- compatibility with Vixie cron, but it is also available to scheme
- configuration files. The command (with-mail-out action . user) can be
- used to direct output from the action (which may be a procedure, list,
- or string) into an e-mail to the user.
- In the case that the action is a string, then percentage signs are
- processed as per the vixie specifications, and information is piped to
- the shell command's standard input.
- @subsection Setting environment variables
- @cindex environment variables in scheme
- @cindex setting environment variables
- @findex append-environment-mods
- Also for compatibility with Vixie cron, mcron has the ability to set
- environment variables in configuration files. To access this
- functionality from a scheme configuration file, use the command
- (append-environment-mods name value), where name is the name of an
- environment variable, and value is the value put to it. A value of #f
- will remove the variable from the environment.
- Note that environment modifications are accumulated as the
- configuration file is processed, so when a job actually runs, its
- environment will be modified according to the modifications specified
- before the job specification in the configuration file.
- @node Extended Guile examples, Vixie Syntax, Guile Syntax, Syntax
- @section Extended Guile examples
- @cindex examples, extended guile
- @cindex extended guile examples
- While Guile gives you flexibility to do anything, and the power to
- represent complex requirements succinctly, things are not always as
- they seem. The following examples illustrate some pitfalls, and
- demonstrate how to code around them.
- @menu
- * AT commands::
- * Every second Sunday::
- * Two hours every day::
- * Missing the first appointment::
- * Penultimate day of every month::
- @end menu
- @node AT commands, Every second Sunday, Extended Guile examples, Extended Guile examples
- @subsection Synthesizing ``at'' commands
- @cindex at command
- The current implementation of mcron does not provide for an at command
- (a command-line program that allows the user to specify that a job
- runs exactly once at a certain time). This can, however, be achieved.
- Suppose the program @code{my-program} needs to be run at midnight
- tonight. A Guile script like the following would work (but a printed
- schedule, obtained with the @code{--schedule} option, will show
- superfluous entries).
- @example
- (job '(next-day)
- (lambda () (system "my-program")
- (kill (getppid) SIGINT)))
- @end example
- @node Every second Sunday, Two hours every day, AT commands, Extended Guile examples
- @subsection Every second Sunday
- @cindex examples, every second sunday
- To run @code{my-program} on the second Sunday of every month, a Guile
- script like the following should suffice (it is left as an exercise to
- the student to understand how this works!).
- @example
- (job (lambda (current-time)
- (let* ((next-month (next-month-from current-time))
- (first-day (tm:wday (localtime next-month)))
- (second-sunday (if (eqv? first-day 0)
- 8
- (- 14 first-day))))
- (+ next-month (* 24 60 60 second-sunday))))
- "my-program")
- @end example
- @node Two hours every day, Missing the first appointment, Every second Sunday, Extended Guile examples
- @subsection Two hours every day
- @cindex examples, two hours every day
- @cindex pitfalls, two hours every day
- Surprisingly perhaps, the following will @strong{not} have the desired
- effect.
- @example
- (job '(next-hour-from (next-day) '(1 2))
- "my-program")
- @end example
- Rather than running the my-program program at one o'clock and two
- o'clock every day, it will only run it at one o'clock. This is because
- each time mcron has to compute the next time to run the command, it
- first obtains the next day, and then finds the earliest hour in that
- day to run at. Thus, after running the command at one o'clock, the
- program first skips forwards to the next midnight (missing the two
- o'clock appointment), and then finds the next one o'clock schedule.
- The following simple command is the correct way to specify this
- behaviour.
- @example
- (job '(next-hour '(1 2)) "my-program")
- @end example
- @node Missing the first appointment, Penultimate day of every month, Two hours every day, Extended Guile examples
- @subsection Missing the first appointment
- @cindex examples, missing the first appointment
- @cindex pitfalls, missing the first appointment
- The command
- @example
- (job '(next-hour-from (next-day) '(16))
- "my-program")
- @end example
- will run @code{my-program} every day at four o'clock in the
- afternoon. However, if mcron is started with this script at midday,
- the first time the command will run will be four o'clock tomorrow;
- today's appointment will be missed (one time only).
- The correct way to specify this requirement is simply
- @example
- (job '(next-hour '(16))
- "my-program")
- @end example
- @node Penultimate day of every month, , Missing the first appointment, Extended Guile examples
- @subsection Penultimate day of every month
- @cindex examples, penultimate day of every month
- The following will run the @code{my-program} program on the
- second-to-last day of every month.
- @example
- (job '(- (next-month-from (next-month)) (* 48 3600))
- "my-program")
- @end example
- @node Vixie Syntax, , Extended Guile examples, Syntax
- @section Vixie
- @cindex syntax, vixie
- @cindex vixie syntax
- @cindex vixie definition
- @cindex vixie compatibility
- @cindex compatibility, vixie
- @emph{NOTE} that this section is definitive. If there is a difference in
- behaviour between the mcron program and this part of the manual, then
- there is a bug in the program. This section is also copied verbatim
- from Paul Vixie's documentation for his cron program, and his
- copyright notice is duly reproduced below.
- There are three problems with this specification.
- @cindex zero'th day of month
- @cindex 0'th day of month
- 1. It is allowed to specify days of the month in the range 0-31. What
- does it mean to specify day 0? Looking at the Vixie source code, it
- seems that if this date appears as part of a list, it has no
- effect. However, if it appears on its own, the effect is to say
- ``don't run on any particular day of the month, only take the week-day
- specification into account.'' Mcron has been coded to mimic this
- behaviour as a special case (unmodified mcron logic implies that this
- date specification would cause jobs to run on the last day of the
- previous month).
- @cindex thirteenth month of year
- @cindex 13th month of year
- 2. Similarly to the above (but different), months of the year can be
- specified in the range 0-12. In the case of mcron (don't know what
- Vixie cron did) month 12 will cause the program to wait until January
- of the following year (but don't rely on this).
- @cindex shell
- @cindex environment variables, shell
- @cindex /etc/passwd
- 3. Somewhere it says that cron sets the SHELL environment variable to
- /bin/sh, and elsewhere it implies that the default behaviour is for
- the user's default shell to be used to execute commands. Mcron sets
- the variable and runs the command in the user's default shell, as
- advertised by the /etc/passwd file.
- @menu
- * Paul Vixie's copyright::
- * Crontab file::
- * Incompatibilities with old Unices::
- @end menu
- @node Paul Vixie's copyright, Crontab file, Vixie Syntax, Vixie Syntax
- @subsection Paul Vixie's copyright
- @cindex copyright, Paul Vixie's
- @cindex Paul Vixie's copyright
- @quotation
- Copyright 1988,1990,1993,1994 by Paul Vixie
- All rights reserved
- Distribute freely, except: don't remove my name from the source or
- documentation (don't take credit for my work), mark your changes (don't
- get me blamed for your possible bugs), don't alter or remove this
- notice. May be sold if buildable source is provided to buyer. No
- warrantee of any kind, express or implied, is included with this
- software; use at your own risk, responsibility for damages (if any) to
- anyone resulting from the use of this software rests entirely with the
- user.
- @end quotation
- @node Crontab file, Incompatibilities with old Unices, Paul Vixie's copyright, Vixie Syntax
- @subsection Crontab files
- @cindex crontab file
- @cindex vixie crontab file
- A @code{crontab} file contains instructions to the @code{cron} daemon
- of the general form: ``run this command at this time on this date''.
- Each user has their own crontab, and commands in any given crontab
- will be executed as the user who owns the crontab. Uucp and News will
- usually have their own crontabs, eliminating the need for explicitly
- running @code{su} as part of a cron command.
- @cindex comments, vixie-style
- Blank lines and leading spaces and tabs are ignored. Lines whose first
- non-space character is a pound-sign (#) are comments, and are ignored.
- Note that comments are not allowed on the same line as cron commands, since
- they will be taken to be part of the command. Similarly, comments are not
- allowed on the same line as environment variable settings.
- An active line in a crontab will be either an environment setting or a cron
- command. An environment setting is of the form,
- @cindex environment setting, vixie-style
- @example
- name = value
- @end example
- where the spaces around the equal-sign (=) are optional, and any
- subsequent non-leading spaces in @code{value} will be part of the
- value assigned to @code{name}. The @code{value} string may be placed
- in quotes (single or double, but matching) to preserve leading or
- trailing blanks.
- @cindex environment variables, SHELL
- @cindex environment variables, LOGNAME
- @cindex environment variables, HOME
- @cindex SHELL environment variable
- @cindex LOGNAME environment variable
- @cindex HOME environment variable
- @cindex /etc/passwd
- Several environment variables are set up automatically by the
- @code{cron} daemon. SHELL is set to /bin/sh, and LOGNAME and HOME are
- set from the /etc/passwd line of the crontab's owner. HOME and SHELL
- may be overridden by settings in the crontab; LOGNAME may not.
- @cindex environment variables, USER
- @cindex USER environment variable
- @cindex BSD
- (Another note: the LOGNAME variable is sometimes called USER on BSD systems...
- on these systems, USER will be set also.) @footnote{mcron has not been
- ported to BSD, so these notes are not relevant.}
- @cindex environment variables, MAILTO
- @cindex MAILTO environment variable
- In addition to LOGNAME, HOME, and SHELL, @code{cron} will look at
- MAILTO if it has any reason to send mail as a result of running
- commands in ``this'' crontab. If MAILTO is defined (and non-empty),
- mail is sent to the user so named. If MAILTO is defined but empty
- (MAILTO=""), no mail will be sent. Otherwise mail is sent to the
- owner of the crontab. This option is useful if you decide on
- /bin/mail instead of /usr/lib/sendmail as your mailer when you install
- cron -- /bin/mail doesn't do aliasing, and UUCP usually doesn't read
- its mail.
- The format of a cron command is very much the V7 standard, with a number of
- upward-compatible extensions. Each line has five time and date fields,
- followed by a user name if this is the system crontab file,
- followed by a command. Commands are executed by @code{cron}
- when the minute, hour, and month of year fields match the current
- time, @strong{and} when at least one of the two day fields (day of month, or day of week)
- match the current time (see ``Note'' below). @code{cron} examines cron entries once every minute.
- The time and date fields are:
- @cindex vixie time specification fields
- @cindex fields, vixie time specification
- @multitable @columnfractions .2 .5
- @item Field @tab Allowed values
- @item ----- @tab --------------
- @item minute @tab 0-59
- @item hour @tab 0-23
- @item day of month @tab 0-31
- @item month @tab 0-12 (or names, see below)
- @item day of week @tab 0-7 (0 or 7 is Sun, or use names)
- @end multitable
- A field may be an asterisk (*), which always stands for ``first-last''.
- @cindex ranges in vixie time specifications
- Ranges of numbers are allowed. Ranges are two numbers separated
- with a hyphen. The specified range is inclusive. For example,
- 8-11 for an ``hours'' entry specifies execution at hours 8, 9, 10
- and 11.
- @cindex lists in vixie time specifications
- Lists are allowed. A list is a set of numbers (or ranges)
- separated by commas. Examples: ``1,2,5,9'', ``0-4,8-12''.
- @cindex steps in vixie time specifications
- Step values can be used in conjunction with ranges. Following
- a range with ``/<number>'' specifies skips of the number's value
- through the range. For example, ``0-23/2'' can be used in the hours
- field to specify command execution every other hour (the alternative
- in the V7 standard is ``0,2,4,6,8,10,12,14,16,18,20,22''). Steps are
- also permitted after an asterisk, so if you want to say ``every two
- hours'', just use ``*/2''.
- @cindex names in vixie-style time specifications
- Names can also be used for the ``month'' and ``day of week''
- fields. Use the first three letters of the particular
- day or month (case doesn't matter). Ranges or
- lists of names are not allowed. @footnote{Mcron allows any alphabetic
- characters after a name, so full names of days or months are also valid.}
- @cindex % character on vixie-style commands
- @cindex standard input, vixie-style
- The ``sixth'' field (the rest of the line) specifies the command to be
- run.
- The entire command portion of the line, up to a newline or %
- character, will be executed by /bin/sh or by the shell
- specified in the SHELL variable of the cronfile.
- Percent-signs (%) in the command, unless escaped with backslash
- (\\), will be changed into newline characters, and all data
- after the first % will be sent to the command as standard
- input.
- @cindex day specification, vixie-style
- @cindex vixie-style day specification
- Note: The day of a command's execution can be specified by two
- fields -- day of month, and day of week. If both fields are
- restricted (ie, aren't *), the command will be run when
- @emph{either}
- field matches the current time. For example,
- ``30 4 1,15 * 5''
- would cause a command to be run at 4:30 am on the 1st and 15th of each
- month, plus every Friday.
- EXAMPLE CRON FILE
- @example
- # use /bin/sh to run commands, no matter what /etc/passwd says
- SHELL=/bin/sh
- # mail any output to `paul', no matter whose crontab this is
- MAILTO=paul
- #
- # run five minutes after midnight, every day
- 5 0 * * * $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
- # run at 2:15pm on the first of every month -- output mailed to paul
- 15 14 1 * * $HOME/bin/monthly
- # run at 10 pm on weekdays, annoy Joe
- 0 22 * * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%
- 23 0-23/2 * * * echo "run 23 minutes after midn, 2am, 4am ..., everyday"
- 5 4 * * sun echo "run at 5 after 4 every sunday"
- @end example
- @node Incompatibilities with old Unices, , Crontab file, Vixie Syntax
- @subsection Extensions and incompatibilities
- @cindex incompatibilities with old Unices
- @cindex extensions, vixie over old Unices
- This section lists differences between Paul Vixie's cron and the
- olde-worlde BSD and AT&T programs, for the benefit of system
- administrators and users who are upgrading all the way.
- @itemize @bullet
- @item
- @cindex day 7
- When specifying day of week, both day 0 and day 7 will be considered Sunday.
- BSD and AT&T seem to disagree about this.
- @item
- Lists and ranges are allowed to co-exist in the same field. "1-3,7-9" would
- be rejected by AT&T or BSD cron -- they want to see "1-3" or "7,8,9" ONLY.
- @item
- Ranges can include "steps", so "1-9/2" is the same as "1,3,5,7,9".
- @item
- Names of months or days of the week can be specified by name.
- @item
- Environment variables can be set in the crontab. In BSD or AT&T, the
- environment handed to child processes is basically the one from /etc/rc.
- @item
- Command output is mailed to the crontab owner (BSD can't do this), can be
- mailed to a person other than the crontab owner (SysV can't do this), or the
- feature can be turned off and no mail will be sent at all (SysV can't do this
- either).
- @end itemize
- @node Invoking, Guile modules, Syntax, Top
- @chapter Detailed invoking
- @cindex invoking
- @cindex personality
- @cindex mcron program
- @cindex cron program
- @cindex crond program
- @cindex crontab program
- The program adopts one of three different personalities depending on
- the name used to invoke it. In a standard installation, the program is
- installed in the system under the names mcron, cron and crontab
- (installed SUID).
- The recommended way to invoke the program is via the mcron personality
- described in the next section. The program can also be run as cron by
- root, and by the SUID program crontab by individual users to gain
- backwards compatibility with Vixie cron. However, due to the fact that
- this daemon process is shared by, and under control of, all the users
- of the system it is possible (though very unlikely) that it may become
- unusable, hence the recommendation to use the mcron personality.
- @cindex deprecated, vixie personality
- Furthermore, the Vixie personality is considered deprecated by this
- author (it offers not a single advantage over the mcron personality,
- and bloats the code by a factor of three). It is unlikely that this
- personality will ever actually go away, but the program may in future
- be split into two distinct parts, and new developments will only take
- place in the part which implements the mcron personality.
- @menu
- * Invoking mcron::
- * Invoking cron or crond::
- * Invoking crontab::
- * Behaviour on laptops::
- * Exit codes::
- @end menu
- @node Invoking mcron, Invoking cron or crond, Invoking, Invoking
- @section Invoking mcron
- @cindex invoking mcron
- @cindex mcron options
- @cindex mcron arguments
- @cindex command line, mcron
- @cindex mcron command line
- Mcron should be run by the user who wants to schedule his jobs. It
- may be made a background job using the facilities of the shell. The
- basic command is @code{mcron [OPTION ...] [file ...]} which has the
- effect of reading all the configuration files specified (subject to
- the options) and then waiting until it is time to execute some
- command. If no files are given on the command line, then mcron will
- look in the user's cron configuration directories: these are ~/.cron
- (deprecated), the directory indicated by the @code{XDG_CONFIG_HOME}
- environment variable, or ~/.config/cron if this variable is not set.
- In any case, files which end in the extension .vixie or .vix will be
- assumed to contain Vixie-style crontabs, and files ending .guile or
- .gle will be assumed to contain scheme code and will be executed as
- such; ANY OTHER FILES WILL BE IGNORED - specify a file name of ``-''
- and then pipe the files into the standard input if you really want to
- read them, possibly using the @code{stdin} option to specify the type
- of file.
- The program accepts the following options.
- @table @option
- @item -s count
- @itemx --schedule=count
- @cindex printout of jobs schedule
- @cindex schedule of jobs, listing
- @cindex options, schedule
- @cindex options, -s
- @cindex -s option
- @cindex --schedule option
- With this option specified no commands are run. Instead, the program
- computes the times the commands would be run and prints the
- information to the screen, and then immediately exits.
- The count indicates the number of commands to display.
- @cindex daemon option
- @cindex options, daemon
- @cindex options, -d
- @cindex -d option
- @cindex --daemon option
- @item -d
- @itemx --daemon
- With this option the program will detach itself from the controlling
- terminal and run as a daemon process.
- @cindex stdin option
- @cindex options, stdin
- @cindex options, -i
- @cindex -i option
- @cindex --stdin option
- @cindex standard input, configuring from
- @cindex configuring from standard input
- @item -i (vixie|guile)
- @itemx --stdin=(vixie|guile)
- This option is used to indicate whether the configuration information
- being passed on the standard input is in Vixie format or Guile
- format. Guile is the default.
- @cindex -v option
- @cindex --version option
- @cindex options, -v
- @cindex options, version
- @item -v
- @itemx --version
- This option causes a message to be printed on the standard output with
- information about the version and copyright for the current program.
- @cindex -h option
- @cindex --help option
- @cindex options, -h
- @cindex options, --help
- @item -h
- @itemx --help
- This causes a short but complete usage message to be displayed on
- standard output.
- @end table
- @node Invoking cron or crond, Invoking crontab, Invoking mcron, Invoking
- @section Invoking cron or crond
- @cindex cron, invokation
- @cindex invoking cron
- @cindex crond, invokation
- @cindex invoking crond
- @cindex @value{CONFIG_SPOOL_DIR}
- @cindex @value{CONFIG_SOCKET_FILE}
- NOTE THAT THIS SECTION ONLY APPLIES IF THE @code{cron} or
- @code{crond}, and @code{crontab} PROGRAMS HAVE BEEN INSTALLED BY THE
- SYSTEM ADMINISTRATOR.
- If the program runs by the name of @code{cron} or @code{crond}, then
- it will read all the files in @code{@value{CONFIG_SPOOL_DIR}} (which
- should only be readable by root) and the file @code{/etc/crontab}, and
- then detaches itself from the terminal to live forever as a daemon
- process. Additionally, it creates a UNIX socket at
- @code{@value{CONFIG_SOCKET_FILE}}, and listens for messages sent to
- that socket consisting of a user name whose crontabs have been
- changed. In this case, the program will re-read that user's crontab.
- This is for correct functioning with the crontab program.
- Further, if the @code{--noetc} option was not used, a job is scheduled
- to run every minute to check if /etc/crontab has been modified
- recently. If so, this file will also be re-read.
- The options which may be used with this program are as follows.
- @table @option
- @cindex -v option
- @cindex --version option
- @cindex options, -v
- @cindex options, version
- @item -v
- @itemx --version
- This option causes a message to be printed on the standard output with
- information about the version and copyright for the current program.
- @cindex -h option
- @cindex --help option
- @cindex options, -h
- @cindex options, --help
- @item -h
- @itemx --help
- This causes a short but complete usage message to be displayed on
- standard output.
- @item -s [count]
- @itemx --schedule[=count]
- @cindex printout of jobs schedule
- @cindex schedule of jobs, listing
- @cindex options, schedule
- @cindex options, -s
- @cindex -s option
- @cindex --schedule option
- With this option specified no commands are run. Instead, the program
- computes the times the commands would be run and prints the
- information to the screen, and then immediately exits.
- The count, if supplied, indicates the number of commands to
- display. The default value is 8.
- @cindex -n option
- @cindex --noetc option
- @cindex options, -n
- @cindex options, --noetc
- @item -n
- @itemx --noetc
- This tells cron not to add a job to the system which wakes up every
- minute to check for modifications to @code{/etc/crontab}. It is
- recommended that this option be used (and further that the
- @code{/etc/crontab} file be taken off the system altogether!)
- @end table
- @node Invoking crontab, Behaviour on laptops, Invoking cron or crond, Invoking
- @section Invoking crontab
- @cindex crontab, invoking
- @cindex invoking crontab
- This program is run by individual users to inspect or modify their
- crontab files. If a change is made to the file, then the root daemon
- process will be given a kick, and will immediately read the new
- configuration. A warning will be issued to standard output if it
- appears that a cron daemon is not running.
- The command is used as
- @code{crontab [-u user] file}
- or
- @code{crontab [-u user] ( -l | -e | -r )}
- Only the root user can use the -u option, to specify the manipulation
- of another user's crontab file. In the first instance, the entire
- crontab file of the user is replaced with the contents of the
- specified file, or standard input if the file is ``-''.
- In the latter case, the program behaves according to which of the
- (mutually exclusive) options was given (note that the long options are
- an mcron extension).
- @table @option
- @cindex -l option
- @cindex list option, crontab
- @cindex options, -l
- @cindex options, --list
- @cindex viewing a crontab
- @cindex listing a crontab
- @item -l
- @itemx --list
- Print the user's crontab file to the standard output, and exit.
- @cindex -r option
- @cindex remove option
- @cindex options, -r
- @cindex options, --remove
- @cindex deleting a crontab
- @cindex removing a crontab
- @item -r
- @item --remove
- Delete the user's crontab file, and exit.
- @cindex -e option
- @cindex edit option
- @cindex options, -e
- @cindex options, --edit
- @cindex editing a crontab
- @cindex creating a crontab
- @item -e
- @item --edit
- Using the editor specified in the user's VISUAL or EDITOR environment
- variables, allow the user to edit his crontab. Once the user exits the
- editor, the crontab is checked for parseability, and if it is okay
- then it is installed as the user's new crontab and the daemon is
- notified that a change has taken place, so that the new file will
- become immediately effective.
- @end table
- @node Behaviour on laptops, Exit codes, Invoking crontab, Invoking
- @section Behaviour on laptops
- @cindex laptops
- @cindex power suspend
- While mcron has not been designed to work anachronistically, the behaviour of
- mcron when a laptop emerges from a suspended state is well defined, and the
- following description explains what happens in this situation.
- When a laptop awakes from a suspended state, all jobs which would have run while
- the laptop was suspended will run exactly once immediately (and simultaneously)
- when the laptop awakes, and then the next time that those jobs run will be
- computed based on the time the laptop was awoken. Any jobs which would not have
- run during the suspense period will be unaffected, and will still run at their
- proper times.
- @node Exit codes, , Behaviour on laptops, Invoking
- @section Exit codes
- @cindex exit codes
- @cindex error conditions
- @cindex errors
- The following are the status codes returned to the operating system
- when the program terminates.
- @table @asis
- @item 0
- No problems.
- @item 1
- An attempt has been made to start cron but there is already a
- @value{CONFIG_PID_FILE} file. If there really is no other cron daemon
- running (this does not include invokations of mcron) then you should
- remove this file before attempting to run cron.
- @item 2
- In parsing a guile configuration file, a @code{job} command has been
- seen but the second argument is neither a procedure, list or
- string. This argument is the job's action, and needs to be specified
- in one of these forms.
- @item 3
- In parsing a guile configuration file, a @code{job} command has been
- seen but the first argument is neither a procedure, list or
- string. This argument is the job's next-time specification, and needs
- to be specified in one of these forms.
- @item 4
- An attempt to run cron has been made by a user who does not have
- permission to access the crontabs in @value{CONFIG_SPOOL_DIR}. These
- files should be readable only by root, and the cron daemon must be run
- as root.
- @item 5
- An attempt to run mcron has been made, but there are no jobs to
- schedule!
- @item 6
- The system administrator has blocked this user from using crontab with
- the files @value{CONFIG_ALLOW_FILE} and @value{CONFIG_DENY_FILE}.
- @item 7
- Crontab has been run with more than one of the arguments @code{-l},
- @code{-r}, @code{-e}. These are mutually exclusive options.
- @item 8
- Crontab has been run with the -u option by a user other than
- root. Only root is allowed to use this option.
- @item 9
- An invalid vixie-style time specification has been supplied.
- @item 10
- An invalid vixie-style job specification has been supplied.
- @item 11
- A bad line has been seen in /etc/crontab.
- @item 12
- The last component of the name of the program was not one of
- @code{mcron}, @code{cron}, @code{crond} or @code{crontab}.
- @item 13
- Either none of the user's configuration directories exist, or there is a problem
- reading the files there. The configuration directories are ~/.cron
- and the directory pointed to by the @code{XDG_CONFIG_HOME} environment
- variable, or ~/.config/cron if this is not set.
- @c @item 14
- @c There is a problem writing to /var/cron/update. This is probably
- @c because the crontab program is not installed SUID root, as it should
- @c be.
- @item 15
- Crontab has been run without any arguments at all. There is no default
- behaviour in this case.
- @item 16
- Cron has been run by a user other than root.
- @end table
- @node Guile modules, Index, Invoking, Top
- @chapter Guile modules
- Some of the key parts of mcron are implemented as modules so they can
- be incorporated into other Guile programs, or even into C-sourced
- programs if they are linked against libguile.
- It may be, for example, that a program needs to perform house-keeping
- functions at certain times of the day, in which case it can spawn
- (either fork or thread) a sub-process which uses a built-in
- mcron. Another example may be a program which must sleep until some
- non-absolute time specified on the Gregorian calendar (the first day
- of next week, for example). Finally, it may be the wish of the user to
- provide a program with the functionality of mcron plus a bit extra.
- The base module maintains mcron's internal job lists, and provides the
- main wait-run-wait loop that is mcron's main function. It also
- introduces the facilities for accumulating a set of environment
- modifiers, which take effect when jobs run.
- @menu
- * The base module:: The job list and execution loop.
- * The redirect module:: Sending output of jobs to a mail box.
- * The vixie-time module:: Parsing vixie-style time specifications.
- * The job-specifier module:: All commands for scheme configuration files.
- * The vixie-specification module:: Commands for reading vixie-style crontabs.
- @end menu
- @node The base module, The redirect module, Guile modules, Guile modules
- @section The base module
- @cindex guile module
- @cindex base module
- @cindex modules, base
- This module may be used by including @code{(use-modules (mcron base))}
- in a program. The main functions are @code{add-job} and
- @code{run-job-loop}, which allow a program to create a list of job
- specifications to run, and then to initiate the wait-run-wait loop
- firing the jobs off at the requisite times. However, before they are
- introduced two functions which manipulate the environment that takes
- effect when a job runs are defined.
- @cindex environment
- The environment is a set of name-value pairs which is built up
- incrementally. Each time the @code{add-job} function is called, the
- environment modifiers that have been accumulated up to that point are
- stored with the new job specification, and when the job actually runs
- these name-value pairs are used to modify the run-time environment in
- effect.
- @deffn{Scheme procedure} append-environment-mods name value
- When a job is run make sure the environment variable @var{name} has
- the value @var{value}.
- @end deffn
- @deffn{Scheme procedure} clear-environment-mods
- This procedure causes all the environment modifiers that have been
- specified so far to be forgotten.
- @end deffn
- @deffn{Scheme procedure} add-job time-proc action displayable configuration-time configuration-user
- This procedure adds a job specification to the list of all jobs to
- run. @var{time-proc} should be a procedure taking exactly one argument
- which will be a UNIX time. This procedure must compute the next time
- that the job should run, and return the result. @var{action} should be
- a procedure taking no arguments, and contains the instructions that
- actually get executed whenever the job is scheduled to
- run. @var{displayable} should be a string, and is only for the use of
- humans; it can be anything which identifies or simply gives a clue as
- to the purpose or function of this job. @var{configuration-time} is
- the time from which the first invokation of this job should be
- computed. Finally, @var{configuration-user} should be the passwd entry
- for the user under whose personality the job is to run.
- @end deffn
- @deffn{Scheme procedure} run-job-loop . fd-list
- @cindex file descriptors
- @cindex interrupting the mcron loop
- This procedure returns only under exceptional circumstances, but
- usually loops forever waiting for the next time to arrive when a job
- needs to run, running that job, recomputing the next run time, and
- then waiting again. However, the wait can be interrupted by data
- becoming available for reading on one of the file descriptors in the
- fd-list, if supplied. Only in this case will the procedure return to
- the calling program, which may then make modifications to the job list
- before calling the @code{run-job-loop} procedure again to resume execution of
- the mcron base.
- @end deffn
- @deffn{Scheme procedure} remove-user-jobs user
- The argument @var{user} should be a string naming a user (his
- login name), or an integer UID, or an object representing the user's passwd
- entry. All jobs on the current job list that are scheduled to be run
- under this personality are removed from the job list.
- @end deffn
- @deffn{Scheme procedure} get-schedule count
- @cindex schedule of jobs
- The argument @var{count} should be an integer value giving the number
- of time-points in the future to report that jobs will run as. Note
- that this procedure is disruptive; if @code{run-job-loop} is called
- after this procedure, the first job to run will be the one after the
- last job that was reported in the schedule report. The report itself
- is returned to the calling program as a string.
- @end deffn
- @node The redirect module, The vixie-time module, The base module, Guile modules
- @section The redirect module
- @cindex redirect module
- @cindex modules, redirect
- This module is introduced to a program with the command
- @code{(use-modules (mcron redirect))}.
- This module provides the @code{with-mail-out} function, described
- fully in @ref{Guile Syntax}.
- @node The vixie-time module, The job-specifier module, The redirect module, Guile modules
- @section The vixie-time module
- @cindex vixie-time module
- @cindex modules, vixie-time
- This module is introduced to a program by @code{(use-modules (mcron
- vixie-time))}.
- This module provides a single method for converting a vixie-style time
- specification into a procedure which can be used as the
- @code{next-time-function} to the base @code{add-job} procedure, or to
- the @code{job-specifier} @code{job} procedure. See @ref{Vixie Syntax}
- for full details of the allowed format for the time string.
- @deffn{Scheme procedure} parse-vixie-time time-string
- The single argument @var{time-string} should be a string containing a
- vixie-style time specification, and the return value is the required
- procedure.
- @end deffn
- @node The job-specifier module, The vixie-specification module, The vixie-time module, Guile modules
- @section The job-specifier module
- @cindex job-specifier module
- @cindex modules, job-specifier
- This module is introduced to a program by @code{(use-modules (mcron
- job-specifier))}.
- This module provides all the functions available to user's Guile
- configuration files, namely @code{range}, @code{next-year-from},
- @code{next-year}, @code{next-month-from}, @code{next-month},
- @code{next-day-from}, @code{next-day}, @code{next-hour-from},
- @code{next-hour}, @code{next-minute-from}, @code{next-minute},
- @code{next-second-from}, @code{next-second},
- and last but not least, @code{job}. See @ref{Guile Syntax} for full
- details.
- Once this module is loaded, a scheme configuration file can be used to
- put jobs onto the job list simply by @code{load}ing the file.
- @node The vixie-specification module, , The job-specifier module, Guile modules
- @section The vixie-specification module
- @cindex vixie-specification module
- @cindex modules, vixie-specification
- To use this module, put the command @code{(use-modules (mcron
- vixie-specification))} into your program.
- This module exports a couple of functions for adding jobs to the
- internal job list according to a Vixie-style crontab file.
- @deffn{Scheme procedure} read-vixie-port port . parse-line
- This procedure reads a crontab from the given port, and adds jobs to
- the job list accordingly, taking care of environment specifications
- and comments which may appear in such a file.
- @var{parse-line} should not normally be used, except that if you are
- parsing a (deprecated) @code{/etc/crontab} file with a slightly
- modified syntax, you may pass the value @var{parse-system-vixie-line}
- as the optional argument.
- @end deffn
- @deffn{Scheme procedure} read-vixie-file name . parse-line
- This procedure attempts to open the named file, and if it fails will
- return silently. Otherwise, the behaviour is identical to
- @code{read-vixie-port} above.
- @end deffn
- Once this module has been declared in a program, a crontab file can be
- used to augment the current job list with a call to
- @code{read-vixie-file}.
- @node GNU Free Documentation License
- @appendix GNU Free Documentation License
- @include fdl.texi
- @node Index, , Guile modules, Top
- @unnumbered Index
- @printindex cp
- @bye
|