From dc14212752309d626fdab5f5833db1718672db29 Mon Sep 17 00:00:00 2001 From: Konstantin Stepanov Date: Wed, 22 Jul 2015 15:39:45 +0300 Subject: [PATCH] compile man files --- build.rs | 26 +- man/anacrontab.5.in | 91 +++++++ man/crontab.1.in | 62 +++++ man/crontab.5.in | 375 +++++++++++++++++++++++++++++ man/systemd-crontab-generator.8.in | 101 ++++++++ man/systemd.cron.7.in | 179 ++++++++++++++ 6 files changed, 825 insertions(+), 9 deletions(-) create mode 100644 man/anacrontab.5.in create mode 100644 man/crontab.1.in create mode 100644 man/crontab.5.in create mode 100644 man/systemd-crontab-generator.8.in create mode 100644 man/systemd.cron.7.in diff --git a/build.rs b/build.rs index 1cab981..6e18d02 100644 --- a/build.rs +++ b/build.rs @@ -11,13 +11,13 @@ use rumblebars::{Template, EvalContext}; use rustc_serialize::json::Json; static UNITS_DIR: &'static str = "units"; +static MAN_DIR: &'static str = "man"; fn main() { let out_dir = env::var("OUT_DIR").unwrap(); let output = Path::new(&*out_dir); let data = build_render_data(); - let ctx = EvalContext::new(); let mut config = File::create(out_dir.clone() + "/config.rs").unwrap(); writeln!(config, "pub static USERS_CRONTAB_DIR: &'static str = {:?};", data["statedir"].as_string().unwrap()).unwrap(); @@ -27,17 +27,25 @@ fn main() { let data = Json::Object(data); - for entry in fs::read_dir(UNITS_DIR).unwrap() { + compile_templates(UNITS_DIR, output, &data); + compile_templates(MAN_DIR, output, &data); +} + +fn compile_templates>(source_dir: &str, output_dir: P, data: &Json) { + let ctx = EvalContext::new(); + for entry in fs::read_dir(source_dir).unwrap() { let entry = entry.unwrap(); let name = entry.file_name().into_string().unwrap(); - let target = output.join(&name[..name.len()-3]); - let tmpl = File::open(entry.path()).and_then(|mut file| { - let mut buf = String::new(); - file.read_to_string(&mut buf).map(|_| Template::new(&*buf).unwrap()) - }).unwrap(); + if name.ends_with(".in") { + let target = output_dir.as_ref().join(&name[..name.len()-3]); + let tmpl = File::open(entry.path()).and_then(|mut file| { + let mut buf = String::new(); + file.read_to_string(&mut buf).map(|_| Template::new(&*buf).unwrap()) + }).unwrap(); - println!("generating unit: {:?} -> {:?}...", entry.path(), target); - tmpl.eval(&data, &mut File::create(target).unwrap(), &ctx).unwrap(); + println!("compiling from template: {:?} -> {:?}...", entry.path(), target); + tmpl.eval(data, &mut File::create(target).unwrap(), &ctx).unwrap(); + } } } diff --git a/man/anacrontab.5.in b/man/anacrontab.5.in new file mode 100644 index 0000000..c71c620 --- /dev/null +++ b/man/anacrontab.5.in @@ -0,0 +1,91 @@ +.TH ANACRONTAB 5 "2014-09-16" "{{ package }} {{ version }}" anacrontab + +.SH NAME +/etc/anacrontab \- monotonic jobs + +.SH DESCRIPTION +The file +.I /etc/anacrontab +follow the rules previously set by \fBanacron(8)\fR. +.PP +Lines starting with '#' are comments. +.PP +Environment variables can be set using +.B VAR=VALUE +keypairs. +.PP + +The special +.B RANDOM_DELAY +(in minutes) environment variable is translated to +.B AccuracySec=. + +The special +.B START_HOURS_RANGE +(in hours) environment variable is translated to the +.I \'hour\' +component of +.B OnCalendar=. +anacron expect a range in the format ##-##, systemd-crontab-generator +only use the starting hour of the range as reference. + +The other lines are job-descriptions that follow this layout: +.PP +.B period delay job-identifier command +.PP +.TP +* +.I period +is a number of days to wait between each job execution, or special values @daily, @weekly, @monthly, @yearly +.PP +.TP +* +.I delay +is a number of extra minutes to wait before starting job. It is translated in +.B OnBootSec= +. +.PP +.TP +* +.I job-identifier +is a single word. systemd-crontab-generator uses it to construct the dynamic unit names: +.I cron--root-0.timer +and matching +.I cron--root-0.service +.PP +.TP +* +.I command +is the command that is run by a shell + +.SH BUGS +systemd-crontab-generator doesn't support multiline commands. +.PP +Any +.I period +greater than 30 is rounded to the closest month +.PP +There are subtle differences on how anacron & systemd handle persistente timers: +anacron will run a weekly job at most once a week, with allways a minimum delay of 6 days +between runs; where systemd will try to run it every monday at 00:00; +or as soon the system boot. In the most extreme case, if a system was only started on sunday; +a weekly job will run this day and the again the next (mon)day. +.br +With carefull manual settings, it would be possible to run the +real anacron binary (not your distro's package) with systemd-cron; +if you need an identical behaviour. +.br +There is no difference for the daily job. + +.SH DIAGNOSTICS +After editing /etc/anacrontab, you can run +.I journalctl -n +and +.I systemctl list-timers +to see if the timers have well been updated. + +.SH "SEE ALSO" +.B systemd-crontab-generator(8), systemd.timer(5) + +.SH AUTHOR +Alexandre Detiste diff --git a/man/crontab.1.in b/man/crontab.1.in new file mode 100644 index 0000000..b5dc422 --- /dev/null +++ b/man/crontab.1.in @@ -0,0 +1,62 @@ +.TH "CRONTAB" "1" "2014-12-10" "{{ package }} {{ version }}" "crontab" + +.SH NAME +crontab - maintain crontab files for individual users + +.SH SYNOPSIS +crontab [\-u user] file +.br +crontab [\-u user] [\-l | \-r | \-e | \-s] [\-i] + +.TP +.B (blank) +default operation is replace +.TP +.B -u, --user +edit some other user's crontab +.TP +.B -l, --list +list user's crontab +.TP +.B -r, --remove +delete user's crontab +.TP +.B -e, --edit +edit user's crontab +.TP +.B -s, --show +show all user who have a crontab +.TP +.B -i, --ask +prompt before deleting user's crontab + +.SH DESCRIPTION +Crontab is the program used to let users install, deinstall or list +recurrent jobs in the legacy cron format. +.br +Each user can have their own crontab, and though these are files in {{ statedir }}, +they are not intended to be edited directly. +.br +These jobs are then automatically translated in systemd Timers & Units +by systemd-crontab-generator. + +.SH FILES +.TP +.I {{ statedir }} +Directory for users crontabs. +.TP +.I /etc/cron.allow +list of users that can use crontab +.TP +.I /etc/cron.deny +list of users that aren't allowed to use crontab +.br +(by default, only root can use crontab) + +.SH LIMITATIONS +SELinux is not supported. + +.SH AUTHOR +Konstantin Stepanov +.br +Alexandre Detiste for this manpage & setgid helper diff --git a/man/crontab.5.in b/man/crontab.5.in new file mode 100644 index 0000000..bc328db --- /dev/null +++ b/man/crontab.5.in @@ -0,0 +1,375 @@ +.\"/* 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. +.\" * +.\" * Send bug reports, bug fixes, enhancements, requests, flames, etc., and +.\" * I'll try to keep a version up to date. I can be reached as follows: +.\" * Paul Vixie uunet!decwrl!vixie!paul +.\" */ +.\" +.\" $Id: crontab.5,v 2.4 1994/01/15 20:43:43 vixie Exp $ +.\" +.TH CRONTAB 5 "03 July 2014" "{{ package }} {{ version }}" "crontab" +.UC 4 +.SH NAME +crontab \- tables for driving {{ package }} +.SH DESCRIPTION +A +.I crontab +file contains instructions to +.IR {{ package }} +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. +.PP +Blank lines and leading spaces and tabs are ignored. Lines whose first +non-space character is a hash-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. +.PP +An active line in a crontab will be either an environment setting or a cron +command. The crontab file is parsed from top to bottom, so any environment +settings will affect only the cron commands below them in the file. +An environment setting is of the form, +.PP + name = value +.PP +where the spaces around the equal-sign (=) are optional, and any subsequent +non-leading spaces in +.I value +will be part of the value assigned to +.IR name . +The +.I value +string may be placed in quotes (single or double, but matching) to preserve +leading or trailing blanks. The +.I value +string is +.B not +parsed for environmental substitutions or replacement of variables, thus lines +like +.PP + PATH = $HOME/bin:$PATH +.PP +will not work as you might expect. And neither will this work +.PP + A=1 + B=2 + C=$A $B +.PP +There will not be any subsitution for the defined variables in the +last value. +.PP +An alternative for setting up the commands path is using the fact that +many shells will treat the tilde(~) as substitution of $HOME, so if you use +.I bash +for your tasks you can use this: +.PP + SHELL=/bin/bash + PATH=~/bin:/usr/bin/:/bin +.PP + +.I Special variables: +.TP +.B SHELL, PATH, USER, LOGNAME, HOME, LANG +Those are set up automatically by systemd itself, see +.IR systemd.exec (5) +SHELL defaults to /bin/sh. +SHELL and PATH may be overridden by settings in the crontab. + +.TP +.B MAILTO +.br +On error +.IR systemd.cron (7) +will look at MAILTO. If MAILTO is defined mail is sent to this email address. +MAILTO may also be used to direct mail to multiple +recipients by separating recipient users with a comma. +If MAILTO is defined but empty (MAILTO=""), no mail will be sent. +Otherwise mail is sent to the owner of the crontab. +.br +This mail only contains an small excerpt from the log, as seen when using +.B systemctl status +The full output remains avaible in the journal. + +.TP +.B RANDOM_DELAY +(in minutes) environment variable is translated to +.B AccuracySec=. + +.TP +.B DELAY +(in minutes) environment variable is translated to +.B OnBootSec=. +This works like the 'delay' field of anacrontab(5) and make systemd wait # minutes +after boot before starting the unit. This value can also be used to spread out +the start times of @daily/@weekly/@monthly... jobs on a 24/24 system. + +.TP +.B START_HOURS_RANGE +(in hours) environment variable is translated to the +.I \'hour\' +component of +.B OnCalendar=. +This variable is inheritted from anacrontab(5), but also supported in crontab(5) +by systemd-crontab-generator. Anacron expect a time range in the START-END format (eg: 6-9), +systemd-crontab-generator will only use the starting hour of the range as reference. +Unless you set this variable, all the @daily/@weekly/@monthly/@yearly jobs +will run at midnight. If you set this variable and the system was off during +the ours defined in the range, the (persitent) job will start at boot. + +.TP +.B PERSISTENT +With this flag, you can overide the generator default heuristic. +.br +.B 'yes': +force all further jobs to be persistent +.br +.B 'auto': +only recognize @ keywords to be persistent +.br +.B 'no': +force all further jobs not to be persistent + +.TP +.B BATCH +This boolean flag is translated to options +.B CPUSchedulingPolicy=idle +and +.B IOSchedulingClass=idle +when set. + +.PP +The format of a +.B cron command +is the same as the one defined by the cron daemon. +Each line has five time and date fields, +followed by a command, followed by a newline character ('\\n'). +The system crontab (/etc/crontab) and the packages crontabs (/etc/cron.d/*) +use the same format, except that the username for the command is specified after the time and +date fields and before the command. The fields may be separated +by spaces or tabs. +.PP +Commands are executed by +.IR systemd +when the minute, hour, and month of year fields match the current time, +.I and +when at least one of the two day fields (day of month, or day of week) +match the current time (see ``Note'' below). +The time and date fields are: +.IP +.ta 1.5i +field allowed values +.br +----- -------------- +.br +minute 0-59 +.br +hour 0-23 +.br +day of month 1-31 +.br +month 1-12 (or names, see below) +.br +day of week 0-7 (0 or 7 is Sun, or use names) +.br +.PP +A field may be an asterisk (*), which always stands for ``first\-last''. +.PP +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. +.PP +Lists are allowed. A list is a set of numbers (or ranges) +separated by commas. Examples: ``1,2,5,9'', ``0-4,8-12''. +.PP +Step values can be used in conjunction with ranges. Following +a range with ``/'' 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''. +.PP +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. +.PP +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 crontab file. +.\"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. There is no way to split a single command line onto multiple +.\"lines, like the shell's trailing "\\". +.PP +systemd-crontab-generator doesn't handle multi-line command split by +the % character like vixie-cron. +.PP +Note: The day of a command's execution can be specified by two +fields \(em day of month, and day of week. If both fields are +restricted (i.e., aren't *), the command will be run when +.I either +field matches the current time. For example, +.br +``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. One can, however, achieve the desired result +by adding a test to the command (see the last example in EXAMPLE CRON FILE +below). +.PP +Instead of the first five fields, one of eight special strings may appear: +.IP +.ta 1.5i +string meaning +.br +------ ------- +.br +@reboot Run once, at startup. +.br +@yearly Run once a year, "0 0 1 1 *". +.br +@annually (same as @yearly) +.br +@monthly Run once a month, "0 0 1 * *". +.br +@weekly Run once a week, "0 0 * * 0". +.br +@daily Run once a day, "0 0 * * *". +.br +@midnight (same as @daily) +.br +@hourly Run once an hour, "0 * * * *". +.br +.PP +Please note that startup, as far as @reboot is concerned, +may be before some system daemons, +or other facilities, were startup. This is due to the boot order +sequence of the machine. + +.SH EXAMPLE CRON FILE + +The following lists an example of a user crontab file. + +.nf + +# use /bin/bash to run commands, instead of the default /bin/sh +SHELL=/bin/bash +# mail errors 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" +# Run on every second Saturday of the month +0 4 8-14 * * test $(date +\\%u) \-eq 6 && echo "2nd Saturday" +.fi +.SH EXAMPLE SYSTEM CRON FILE + +The following lists the content of a regular system-wide crontab file. Unlike a +user's crontab, this file has the username field, as used by /etc/crontab. + +.nf +# /etc/crontab: system-wide crontab +# Unlike any other crontab you don't have to run the `crontab' +# command to install the new version when you edit this file +# and files in /etc/cron.d. These files also have username fields, +# that none of the other crontabs do. + +SHELL=/bin/sh +PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin + +# m h dom mon dow user command +17 * * * * root cd / && run-parts \-\-report /etc/cron.hourly +25 6 * * * root test \-x /usr/sbin/anacron || ( cd / && run-parts \-\-report /etc/cron.daily ) +47 6 * * 7 root test \-x /usr/sbin/anacron || ( cd / && run-parts \-\-report /etc/cron.weekly ) +52 6 1 * * root test \-x /usr/sbin/anacron || ( cd / && run-parts \-\-report /etc/cron.monthly ) +# +.fi + +.PP +This is only an example, +.B systemd-cron uses native units instead for those jobs. +.br +If you add those lines, your jobs will run twice. + +.SH SEE ALSO +systemd.cron(7), systemd-crontab-generator(8), crontab(1) + +.SH LIMITATIONS +The +.I systemd-cron +units runs with a defined timezone. It currently does not support +per-user timezones. All the tasks: system's and user's will be run based on the +configured timezone. Even if a user specifies the +.I TZ +environment variable in his +.I crontab +this will affect only the commands executed in the crontab, not the execution +of the crontab tasks themselves. + +The +.I crontab +syntax does not make it possible to define all possible periods one could +image off. For example, it is not straightforward to define the last +weekday of a month. If a task needs to be run in a specific period of time +that cannot be defined in the +.I crontab +syntaxs the best approach would be to have the program itself check the +date and time information and continue execution only if the period +matches the desired one. + +.B systemd-crontab-generator +doesn't support these +.B vixie-cron +features: +.TP +* +spawning forking deamons, the 'Service' units are all set with 'Type=oneshot' +.TP +* +multi-line jobs separated by the '%' character +.TP +* +vixie-cron requires that each entry in a crontab end in a newline character. If the +last entry in a crontab is missing a newline (ie, terminated by EOF), vixie-cron will +consider the crontab (at least partially) broken. +.br +systemd-crontab-generator considers this crontab as valid + +.SH DIAGNOSTICS +You can see how your crontab where translated by typing: +.br +.B systemctl cat cron--* +.PP +.B systemctl cat +does support command-line completion. + +.SH AUTHOR +Paul Vixie is the author of +.I cron +and original creator of this manual page. This page has also been modified for +Debian by Steve Greenland, Javier Fernandez-Sanguino and Christian Kastner. +.br +This page has been reworded by Alexandre Detiste for inclusion in systemd-cron. diff --git a/man/systemd-crontab-generator.8.in b/man/systemd-crontab-generator.8.in new file mode 100644 index 0000000..f654c59 --- /dev/null +++ b/man/systemd-crontab-generator.8.in @@ -0,0 +1,101 @@ +.TH SYSTEMD-CRONTAB-GENERATOR 8 "2014-06-29" "{{ package }} {{ version }}" systemd-crontab-generator + +.SH NAME +systemd-crontab-generator - translate cron schedules in systemd Units + +.SH SYNOPSIS +{{ libdir }}/systemd/system-generators/systemd-crontab-generator output_folder + +.SH DESCRIPTION +systemd-crontab-generator is a generator that translates the legacy cron files (see FILES) +into native systemd units & timers. +.PP +It is not meant to be run manually, it is called automatically by systemd. +.PP +It is run +.TP +* +during early boot, +.TP +* +a second time by cron-after-var.service, only if /var is a separate mount, +in order to process user crontabs in {{ statedir }}; if any, +.TP +* +after each manual updates to the cron files, (*) +.TP +* +and when distribution packages add files in /etc/cron.d/. (*) +.PP + +.B +(*): +those are monitored by cron-update.path + +.PP +systemd\-crontab\-generator +implements the +\m[blue]\fBgenerator specification\fR\m[]\&\s-2\u[1]\d\s+2\&. + +.SH FILES +.TP +.B /etc/crontab +System crontab, see \fBcrontab\fR(5). + +.TP +.B /etc/cron.d +Directory for system crontabs provided by packages. + +.TP +.B /etc/anacrontab +See \fBanacrontab\fR(5). + +.TP +.B {{ statedir }} +Directory for users crontabs. +.br + +.TP +.B /run/systemd/generator +Directory where the generated units are stored. + +.TP +.B /run/crond.reboot +Flag used to avoid running @reboot jobs again after boot. + +.TP +.B /var/lib/systemd/timers +Directory where systemd store time stamps needed for the +.I Persistent +feature. + +.SH DIAGNOSTICS +With systemd >= 209, you can execute +.B "systemctl list-timers" +to have a overview of timers and know when they will elapse. +.br + +If you get errors like +.br +.B {{ libdir }}/systemd/system-generators/systemd-crontab-generator failed with error code 1. +.br +in the journal, you can manually run +.br +.B "{{ libdir }}/systemd/system-generators/systemd-crontab-generator /tmp" +.br +to get a more verbose error message. + +.SH SEE ALSO +\fBsystemd.cron\fR(7),\fBcrontab\fR(5),\fBsystemd.unit\fR(5),\fBsystemd.timer\fR(5) + +.SH "NOTES" +.IP " 1." 4 +generator specification +.RS 4 +\%http://www.freedesktop.org/wiki/Software/systemd/Generators +.RE + +.SH AUTHOR +Konstantin Stepanov for the generator +.br +Alexandre Detiste for this man page diff --git a/man/systemd.cron.7.in b/man/systemd.cron.7.in new file mode 100644 index 0000000..48a097a --- /dev/null +++ b/man/systemd.cron.7.in @@ -0,0 +1,179 @@ +.TH SYSTEMD.CRON 7 "" "{{ package }} {{ version }}" systemd.cron + +.SH NAME +systemd.cron - systemd cron units + +.SH SYNOPSIS +cron.target, +cron-boot.timer, cron-boot.target, cron-boot.service, +cron-minutely.timer, cron-minutely.target, cron-minutely.service, +cron-hourly.timer, cron-hourly.target, cron-hourly.service, +cron-daily.timer, cron-daily.target, cron-daily.service, +cron-weekly.timer, cron-weekly.target, cron-weekly.service, +cron-monthly.timer, cron-monthly.target, cron-monthly.service, +cron-quarterly.timer, cron-quarterly.target, cron-quarterly.service, +cron-semi-annually.timer, cron-semi-annually.target, cron-semi-annually.service, +cron-yearly.timer, cron-yearly.target, cron-yearly.service, +cron-update.path, cron-update.service. + +.SH DESCRIPTION +These units provide cron daemon functionality by running scripts in cron directories. +.br +The crontabs are monitored by cron-update.path and are automatically translated by \fBsystemd-crontab-generator\fR(8) . + +.SH FILES +.TP +.I {{ confdir }}/cron.boot +Directory for scripts to be executed on boot. + +.TP +.I {{ confdir }}/cron.minutely +Directory for scripts to be executed every minute. + +.TP +.I {{ confdir }}/cron.hourly +Directory for scripts to be executed every hour. + +.TP +.I {{ confdir }}/cron.daily +Directory for scripts to be executed every day. + +.TP +.I {{ confdir }}/cron.weekly +Directory for scripts to be executed every week. + +.TP +.I {{ confdir }}/cron.monthly +Directory for scripts to be executed every month. + +.TP +.I {{ confdir }}/cron.quarterly +Directory for scripts to be executed every 3 months. + +.TP +.I {{ confdir }}/cron.semi-annually +Directory for scripts to be executed every 6 months. + +.TP +.I {{ confdir }}/cron.yearly +Directory for scripts to be executed every year. + +.TP +.I {{ confdir }}/cron.d +Directory for \fBcrontabs\fR to be executed on a custom schedule. +The files in this folder must follow the \fBcrontab\fR(5) layout. +.br +If there exists a timer of the same name + '.timer' in {{ unitdir }} or /etc/systemd/system, +this crontab will be ignored to enable a smooth migration to native timers. +.br +You can also use this to mask an unneeded crontab provide by a package: +.br +ln \-s /dev/null /etc/systemd/system/[package].timer + +.SH SYSTEM UNITS +.TP +cron.target +The target unit which starts the others. This should be enabled and started to use cron functionality. + +.TP +cron-\fIschedule\fR.timer +The timer units which pull the cron-\fIschedule\fR.target units at the appropriate time. Started and stopped by the +cron.target unit. These units cannot be controlled manually. + +.TP +cron-\fIschedule\fR.target +The targets invoke all service units wanted by them, including cron-\fIschedule\fR.service. + +.TP +cron-\fIschedule\fR.service +The service units which run scripts in the cron directories. Started and stopped by the cron-\fIschedule\fR.target +units. These units cannot be controlled manually. You can use \fBjournalctl\fR(1) to view the output of scripts run +from these units. + +.SH LIMITATIONS +This cron replacement only send mails on failure. The log of jobs is saved in systemd journal. +Do \fInot\fR use with a cron daemon or anacron, otherwise scripts may be +executed multiple times. +.br +All services are run with +.B +Type=oneshot +, that means you can't use systemd-cron to launch long lived forking daemons. + +.SH EXTENSIONS +The generator can optionally turn all crontabs in persistent timers with the +.B PERSISTENT=true +flag, while a regular cron+anacron setup won't catch-up the missed executions of crontabs on boot. + +.SH EXAMPLES + +.IP "Start cron units" +.SB # systemctl start cron.target + +.IP "Start cron units on boot" +.SB # systemctl enable cron.target + +.IP "View script output" +.SB # journalctl -u cron-boot +.br +.SB # journalctl -u cron-minutely +.br +.SB # journalctl -u cron-hourly +.br +.SB # journalctl -u cron-daily +.br +.SB # journalctl -u cron-weekly +.br +.SB # journalctl -u cron-monthly +.br +.SB # journalctl -u cron-quarterly +.br +.SB # journalctl -u cron-semi-annually +.br +.SB # journalctl -u cron-yearly +.br + +.IP "Example service file executed every hour" +.SB [Unit] +.br +.SB Description=Update the man db + +.SB [Service] +.br +.SB Nice=19 +.br +.SB IOSchedulingClass=2 +.br +.SB IOSchedulingPriority=7 +.br +.SB ExecStart=/usr/bin/mandb --quiet + +.SB [Install] +.br +.SB WantedBy=cron-hourly.target + +.SH NOTES +.nr step 1 1 +.IP \n[step]. 3 +The exact times scripts are executed is determined by the values of the special calendar events \fIhourly\fR, +\fIdaily\fR, \fIweekly\fR, \fImonthly\fR, and \fIyearly\fR defined by \fBsystemd.time\fR(7). +.IP \n+[step]. +\fBrun-parts\fR(8) is used to run scripts. Scripts must be executable by \fIroot\fR to run. + +.SH DIAGNOSTICS +With systemd >= 209, you can execute "systemctl list-timers" to have a overview of +timers and know when they will elapse. + +.SH SEE ALSO +.BR systemd (1), +.BR systemd.unit (5), +.BR systemd.service (5), +.BR systemd.target (5), +.BR systemd.timer (5), +.BR systemd.time (7), +.BR systemd-crontab-generator (8), +.BR crontab (5), +.BR run-parts (8) + +.SH AUTHOR +Dwayne Bent