Repository navigation
Releases: Azentrius/cockpit-cronjobs
Release list
Cron Jobs 2.9.0
The status follows converted jobs and the cron service, links to the page and shows in Cockpit's menu;
the page shows missed runs and when cron last started a job, records all jobs of a crontab at once and
can keep a job from starting while its previous run goes on (run recorder version 3).
- Links for the Status Board: every item of the status carries a
linkto its place on the page:
failed#/overview/results(the latest results, failures first),unrecorded
#/overview/crontab(the root crontab, the other users' after it),cron#/overview/notices
(where the page says that cron is not running). The tile goes to the link of its most important
item. - The page follows its address: Cockpit keeps a page that is loaded and, when the Status Board
jumps to it again, only changes its address. The page now listens tolocationchanged: the tab at
once, the card once the page has loaded and is shown. Every tab has an address (#/overview,
#/timers,#/system), and a tab chosen on the page goes into it, so the link to the place shown
before leads there again. Without a place the page opens on Overview as before; a path that is no
place changes nothing. - Status in Cockpit's menu: the menu entry “Cron Jobs” carries Cockpit's own status icon (red: a
job failed or cron is stopped; yellow: a warning, or the status is more than an hour old) with the
summary as its tooltip, judged as the Status Board judges it; nothing to do, no icon. For this
Cockpit loads the page hidden right after the login (preload); until it is opened it only reads
/var/lib/cockpit-cronjobs/status.json(orstatus.de.json) every five minutes and runs nothing
else. - Converted jobs: a run of a job converted to a systemd timer that failed in the last 24 hours, or
lost its end, counts infailed, read from the journal of its service as the page reads it
(R.parseJournal): systemd's own messages only, the last 20 runs. Before, a converted job left the
status, since its line in the crontab is switched off. Only units the conversion wrote count, checked
as back to cron checks them. Timers from root's crontab are named (nightly.timer); those from
another user's crontab are only counted, since the name a conversion suggests for them begins with
the user's. - Cron service: a new item
cron, read as the page reads it:okwhile the service runs; when it
does not,dangerif the crontabs have jobs, elsewarning. The summary then says so first. - Missed runs: when the last run of a recorded job succeeded but the next one its schedule names
left no record five minutes after its time, the job is listed as missed, with the time it was due,
after the failed ones and before the running ones. That is what a stopped cron, or a server that was
down at the time, leaves behind; cron does not catch such runs up. The next run is cron's, clock
changes andCRON_TZincluded (C.nextRun); runs started by hand do not stand in for a scheduled
one. A job with no recorded run yet is not judged: it is not known when recording began. - Record all: each crontab's card offers “Record all” while one of its enabled jobs does not record
its runs. The dialog lists those jobs with their schedules and says how many cannot be recorded (a
%in the command); confirmed, the run recorder (and for another user the directory for their runs)
comes first, then one write of the crontab through the locked step with its backup, each job wrapped
with an ID of its own (C.captureJobs). Every other line stays byte for byte; when a line changed
meanwhile, nothing is written. What the status counts asunrecordedis then one click away. - Not starting while a run goes on: a new option in the dialog of a recorded job. The page puts
the fileno-overlapinto the job's directory of runs, as its owner, after the crontab is written;
the line in the crontab stays as it is, so older versions read it as before. The run recorder,
version 3 (CRONJOBS_RUN_VERSION, the page offers the update as before), then checks each start
under the lock it takes for its records: when a run of this job goes on (a run marker whose process
is the recorder for this ID), the command does not run, the start goes intoskipped.jsonl(the
last 20) and the recorder ends with 75; a start by hand says so on its output. The runs dialog says
that the job does not overlap and how many starts were skipped; a skipped start counts as one cron
made for missed runs. Without the option nothing changes: the job overlaps as with cron. - Starts from cron's log: for a job that does not record its runs ("Not recorded · started …") and
in a new column “Last start” of/etc/crontab,/etc/cron.dand the crontabs the page only shows.
Cron logs each start as(USER) CMD (COMMAND); the page reads those of the last 35 days from the
journal once per load, only cron's own (_UID=0,_COMM=cronorcrond, which journald sets, so no
one else can log a start), the newest of each, and matches them by user and by the command as cron
logs it (C.loggedCommand: before the first unescaped%, bytes escaped as cron'smkprintdoes).
How a run ended is not in the log, and the page says so. Without the journal it shows dashes. - Tests: the unit test checks the status helper against the page's journal parser with the sample
of systemd 259 and made-up runs (failed, killed, running, lost, older than a day, beyond the last 20,
lines of the job that look like systemd's), units that are not a conversion's, other users' timers
and the cron service, with dash and bash, mawk and gawk; the sample moved to
test/journal-sample.js. The end-to-end test converts a failing job, finds its timer in the status,
stops cron for real and finds that in the status and on the page. A unit test forR.missed(within
and past the five minutes, a run that came, runs by hand, no run, no next run, the day summer time
ends) and a browser test (the order, the title, the runs it opens). For record all a unit test of
C.captureJobs(no ID given twice, a%, recorded jobs and other lines as they were) and a browser
test (the dialog, cancelling, one write with its backup, another user's crontab). For not starting
while a run goes on, the recorder with dash and bash (skipped silently or with a word by hand, the
last 20 skips, beside its own slow run, not held back by another job, a dead marker or without the
option),R.parseRuns, and a browser test (only with recording, set and cleared as root and as
another user, the runs dialog, a failure to set it). For cron's log, unit tests ofC.mkprints,
C.loggedCommandandC.parseCronLog, the script with dash and bash against a stand-in for
journalctl (the newest of each, other messages left out, the fields it filters on), a browser test
(an unrecorded job, a%job, bytes beyond ASCII, another user's start, no log), and the end-to-end
test finds the start of a job Debian's cron ran. - Tests for the links and the menu:
test/menu.test.js(new, Node): the icon for every state, an
item worse than the whole, an item out of date (in German and English, with the time), what the
board ignores, the file of the page's language, the start once shown, and every link of the helper
a place of the page with an element to scroll to.test/status.test.js: the link of every item.
The browser tests open each place, follow changes of the address while the page stays loaded, the
tab chosen on the page in the address, paths that are no place, a reload that scrolls nowhere, the
page loaded hidden at a place, and the icon (failed, out of date, English, no file, hidden). The
end-to-end test loads the page without Cockpit's shell, as before; it starts there as well, since
cockpit-ws drops the icon'snotifywithout a shell.
Install
From the Azentrius package repository (Debian, Ubuntu, Fedora, RHEL): set up https://packages.azentrius.com once, then install Cron Jobs in Cockpit under Applications, or with sudo apt install cockpit-cronjobs or sudo dnf install cockpit-cronjobs. The repository takes this release within an hour. It has no openSUSE packages.
From the files of this release (on openSUSE the only way): download the package and SHA256SUMS, check that the download is complete and that this repository's release workflow built it, then install it:
sha256sum --ignore-missing -c SHA256SUMS
gh attestation verify <file> --repo Azentrius/cockpit-cronjobs
sudo apt install ./cockpit-cronjobs_2.9.0-1_all.deb # Debian, Ubuntu
sudo dnf install ./cockpit-cronjobs-2.9.0-1.noarch.rpm # Fedora, RHEL
sudo zypper install --allow-unsigned-rpm ./cockpit-cronjobs-2.9.0-1.noarch.rpm # openSUSEThe .rpm carries no package signature; the two checks take its place. The tests install the packages on Debian 13 and Fedora 43 only.
Other systems: sudo tar -xzf cockpit-cronjobs-2.9.0.tar.gz -C /usr/share/cockpit.
Cron Jobs 2.8.1
The list of recorded runs reads at most the last 64 KiB of each runs.jsonl, so another user can no
longer make it take the server's memory or send the page gigabytes.
- Runs of other users' jobs: the list is read as root, and the runs of another user's jobs lie in
/var/lib/cockpit-cronjobs/users/USER/runs/ID, which that user owns. The page checked that
runs.jsonlis a regular file and no link, then took its last 20 lines withtail -n 20, which keeps
what it reads until it has seen 20 line ends. A user who swapped the file for a link to/dev/zero
right after the check had root'stailtake memory without limit for five seconds, and a file of
gigabytes without line ends went to the page whole. Now the last 64 KiB are taken first
(tail -c 65536 | tail -n 20), as the status helper of 2.8.0 does; 20 records are a few KiB. The
other reads as root in these directories had a bound already: the run markers (head -c 4096) and
the disk use (duundertimeout); a run's output is read as its user. A unit test, with dash and
bash, swaps the file for a link to/dev/zerobetween the check and the read (under a memory limit)
and lists a file of 32 MiB. - Status for the Status Board: 2.8.0 was not released on its own; its status comes with this
release. Failed jobs of the last 24 hours and jobs without recording are worked out as root every
15 minutes bycockpit-cronjobs-status.timer, which the.deband.rpmturn on, and can be read
without administrative access. Details under 2.8.0 in the changelog.
Install
From the Azentrius package repository (Debian, Ubuntu, Fedora, RHEL): set up https://packages.azentrius.com once, then install Cron Jobs in Cockpit under Applications, or with sudo apt install cockpit-cronjobs or sudo dnf install cockpit-cronjobs. The repository takes this release within an hour. It has no openSUSE packages.
From the files of this release (on openSUSE the only way): download the package and SHA256SUMS, check that the download is complete and that this repository's release workflow built it, then install it:
sha256sum --ignore-missing -c SHA256SUMS
gh attestation verify <file> --repo Azentrius/cockpit-cronjobs
sudo apt install ./cockpit-cronjobs_2.8.1-1_all.deb # Debian, Ubuntu
sudo dnf install ./cockpit-cronjobs-2.8.1-1.noarch.rpm # Fedora, RHEL
sudo zypper install --allow-unsigned-rpm ./cockpit-cronjobs-2.8.1-1.noarch.rpm # openSUSEThe .rpm carries no package signature; the two checks take its place. The tests install the packages on Debian 13 and Fedora 43 only.
Other systems: sudo tar -xzf cockpit-cronjobs-2.8.1.tar.gz -C /usr/share/cockpit.
Cron Jobs 2.7.4
Azentrius moves to azentrius.com; the page itself works as before.
- Signature: the word mark links to azentrius.com.
- Package repository: README and release notes name packages.azentrius.com, the new address of the
Azentrius package repository; packages.azentrius.de keeps serving the same packages. - Maintainer of the
.deband.rpm: support@azentrius.com.
Install
From the Azentrius package repository (Debian, Ubuntu, Fedora, RHEL): set up https://packages.azentrius.com once, then install Cron Jobs in Cockpit under Applications, or with sudo apt install cockpit-cronjobs or sudo dnf install cockpit-cronjobs. The repository takes this release within an hour. It has no openSUSE packages.
From the files of this release (on openSUSE the only way): download the package and SHA256SUMS, check that the download is complete and that this repository's release workflow built it, then install it:
sha256sum --ignore-missing -c SHA256SUMS
gh attestation verify <file> --repo Azentrius/cockpit-cronjobs
sudo apt install ./cockpit-cronjobs_2.7.4-1_all.deb # Debian, Ubuntu
sudo dnf install ./cockpit-cronjobs-2.7.4-1.noarch.rpm # Fedora, RHEL
sudo zypper install --allow-unsigned-rpm ./cockpit-cronjobs-2.7.4-1.noarch.rpm # openSUSEThe .rpm carries no package signature; the two checks take its place. The tests install the packages on Debian 13 and Fedora 43 only.
Other systems: sudo tar -xzf cockpit-cronjobs-2.7.4.tar.gz -C /usr/share/cockpit.
Cron Jobs 2.7.3
The page brings its own monospace font, so commands and paths no longer fall back to another font under
Cockpit 314 (Ubuntu 24.04).
- Red Hat Mono comes with the page: commands, paths and schedules are set in Red Hat Mono, as the
design system asks, from the page's ownRedHatMono.woff2(a Latin subset, SIL Open Font License 1.1,
inOFL.txtand NOTICE). Until nowazentrius.csstook the font from Cockpit's
/cockpit/static/fonts/RedHatMono/RedHatMonoVF.woff2, which Cockpit 314 from Ubuntu 24.04 does not
have: every load of the page got a 404 for it, and code was shown in a fallback (Courier New or the
browser's monospace font). The shared design files gain
the font file; the browser tests no longer stand in a font for Cockpit's, and a unit test checks that
everyurl()in the stylesheets names a file of the page.
Install
From the Azentrius package repository (Debian, Ubuntu, Fedora, RHEL): set up https://packages.azentrius.de once, then install Cron Jobs in Cockpit under Applications, or with sudo apt install cockpit-cronjobs or sudo dnf install cockpit-cronjobs. The repository takes this release within an hour. It has no openSUSE packages.
From the files of this release (on openSUSE the only way): download the package and SHA256SUMS, check that the download is complete and that this repository's release workflow built it, then install it:
sha256sum --ignore-missing -c SHA256SUMS
gh attestation verify <file> --repo Azentrius/cockpit-cronjobs
sudo apt install ./cockpit-cronjobs_2.7.3-1_all.deb # Debian, Ubuntu
sudo dnf install ./cockpit-cronjobs-2.7.3-1.noarch.rpm # Fedora, RHEL
sudo zypper install --allow-unsigned-rpm ./cockpit-cronjobs-2.7.3-1.noarch.rpm # openSUSEThe .rpm carries no package signature; the two checks take its place. The tests install the packages on Debian 13 and Fedora 43 only.
Other systems: sudo tar -xzf cockpit-cronjobs-2.7.3.tar.gz -C /usr/share/cockpit.
Cron Jobs 2.7.2
The archive of a release carries the license and the notice; the page itself is unchanged.
- Licenses in the archive:
cockpit-cronjobs-VERSION.tar.gzcontainsLICENSEandNOTICE(as
cronjobs/LICENSEandcronjobs/NOTICE, listed inSHA256SUMS), as the.deband.rpmalready do.
Install
From the Azentrius package repository: set up https://packages.azentrius.de once, then install Cron Jobs in Cockpit under Applications, or with sudo apt install cockpit-cronjobs or sudo dnf install cockpit-cronjobs. The repository takes this release within an hour.
From the files of this release: Debian and Ubuntu sudo apt install ./cockpit-cronjobs_2.7.2-1_all.deb, Fedora, RHEL and openSUSE sudo dnf install ./cockpit-cronjobs-2.7.2-1.noarch.rpm.
Other systems: sudo tar -xzf cockpit-cronjobs-2.7.2.tar.gz -C /usr/share/cockpit.
Check the download against SHA256SUMS, and that it was built by this repository's release workflow:
sha256sum --ignore-missing -c SHA256SUMS
gh attestation verify <file> --repo Azentrius/cockpit-cronjobsCron Jobs 2.7.1
Fixes: conversions to one name at the same time, next runs when the clock changes, steps after a single
value, and CRON_TZ in /etc/crontab and /etc/cron.d.
- Conversions at the same time: two conversions to the same name, from two browsers or tabs, could
both report success, the second overwriting the first one's units; if one of them failed afterwards,
taking back its units could remove those of the other, whose crontab line was already off. Now each
conversion owns the units it writes: they are only created when the name is free, and only the
conversion that wrote them starts their timer or takes them back, all under the crontab lock
(/var/lib/cockpit-cronjobs/converting/says which one while it is under way). Back to cron removes
units under the same lock. - When the clock changes: next runs and the timeline follow cron. When summer time ends, the repeated
hour runs only the jobs with*in the minute or hour field again (until now a job every minute went
missing for that hour), and jobs at a fixed time run once; when it starts, jobs at a fixed time of the
skipped hour run right after the change, the others do not catch up. With cronie, jobs withCRON_TZ
run as cronie runs them. - Steps need
*or a range: a schedule like5/10 * * * *was accepted, but Debian's cron and cronie
both refuse it; the form now says so and names*/10and5-59/10. A timer described in words no
longer comes out as such a schedule. CRON_TZin system crontabs: with cronie,CRON_TZin/etc/crontaband/etc/cron.dnow counts
for the jobs below it in the same file: the timeline draws them at the right time, and they show their
zone with the schedule.- Tests: next runs are compared with a port of cron's main loop around every clock change of 2026 in four
zones; two conversions of one name at the same time, and one that fails after another finished, run
against the root steps with dash and bash.
Install
From the Azentrius package repository: set up https://packages.azentrius.de once, then install Cron Jobs in Cockpit under Applications, or with sudo apt install cockpit-cronjobs or sudo dnf install cockpit-cronjobs. The repository takes this release within an hour.
From the files of this release: Debian and Ubuntu sudo apt install ./cockpit-cronjobs_2.7.1-1_all.deb, Fedora, RHEL and openSUSE sudo dnf install ./cockpit-cronjobs-2.7.1-1.noarch.rpm.
Other systems: sudo tar -xzf cockpit-cronjobs-2.7.1.tar.gz -C /usr/share/cockpit.
Check the download against SHA256SUMS, and that it was built by this repository's release workflow:
sha256sum --ignore-missing -c SHA256SUMS
gh attestation verify <file> --repo Azentrius/cockpit-cronjobsCron Jobs 2.7.0
The page follows the Azentrius design system more closely: states, controls, alerts and texts.
- Running is a good state: a job or timer that runs shows "Running" as a success label with the
check-circle icon, no longer as a hint with sync-alt. "Ignored" in/etc/cron.dcarries the warning
triangle. - Checkboxes in forms: "Record result and output", "Job is active" and "Catch up on missed runs" are
checkboxes, since they only apply with Save or Convert. The switches in the tables stay: they apply at
once. - Alerts above their card: that cron is not installed, that a crontab or the systemd timers could not
be read, or that a crontab opened read-only now shows above the card it is about, and the card says what
it waits for. These errors also say how to fix them, as do those of the journal, of an output and of the
backups. - Field errors once a field is left: the edit dialog, and the name in the convert dialog, show an error
when the field is left or on saving or converting, not while typing. "Convert job" no longer turns grey
for an invalid name; it leads back to the field. - Run recorder: it is updated with "Update" and the arrow-circle-up icon. "Update" and "Install run
recorder" are link buttons in their alerts. - Links out of the page: "Open in Services" and the systemd timer a job was converted to carry the
external-link-alt icon after the text. Other links, such as "Try again" or "Record runs", have no icon. - Buttons name their object: "Run job", "Stop job", "Convert job", "Record runs", "Review runs",
"Remove all runs" and "Install run recorder". - German texts: errors address the reader as "Sie" ("Geben Sie einen Befehl ein.") instead of the
infinitive. - Sizes: in KiB, MiB and GiB, which they always were (1024 based), with a decimal comma in German.
- No systemd timers: the systemd timers tab shows an empty state in a card and says whether the server
has no systemd or no timers. - Details: every control is at least 29 px high on the desktop (44 px on phones), the inline links and
the result labels too; the row menu shows focus as a 2 px ring; spacing comes from the scale of
4, 8, 16, 24, 32 and 48 px only; notes in the changes of a backup are no longer italic. - Signature: the word mark links to azentrius.de; a link to the source code follows version and host.
- Icons:
icons.js, NOTICE and the README name where the icons come from (Font Awesome Free 5.15.4 by
Fonticons, Inc., through@patternfly/react-icons6.4.0). The license text, CC BY 4.0, comes along as
CC-BY-4.0-Font-Awesome.txt, installed with the page and in the packages' documentation. - Tests: the browser tests check the checkboxes, the alerts above their cards, field errors only after a
field is left, controls of at least 29 px, the signature and an empty state for the timers. - Name with the dot: the page title reads "Cron Jobs." with the dot of the Azentrius wordmark, the way
the design system now shows a product name without a suffix. The menu, the signature and AppStream keep
the plain "Cron Jobs", and the README and NOTICE drop "for Cockpit" from the name. - Shared design files:
azentrius.cssgainsaz-page-title--dot, the project-page classes
az-btn--lgandaz-eyebrowand their spacing tokens;tools/build-packages.shcan name packages
that a package replaces under a new name (CONFLICTSinpackaging/package.conf). - Tables no longer widen the page: the table wrapper is positioned (
position: relativeon
.az-table-wrap, as in the design system), so the hidden helper texts in a table head stay inside it
when the table scrolls sideways.
Install
From the Azentrius package repository: set up https://packages.azentrius.de once, then install Cron Jobs in Cockpit under Applications, or with sudo apt install cockpit-cronjobs or sudo dnf install cockpit-cronjobs. The repository takes this release within an hour.
From the files of this release: Debian and Ubuntu sudo apt install ./cockpit-cronjobs_2.7.0-1_all.deb, Fedora, RHEL and openSUSE sudo dnf install ./cockpit-cronjobs-2.7.0-1.noarch.rpm.
Other systems: sudo tar -xzf cockpit-cronjobs-2.7.0.tar.gz -C /usr/share/cockpit.
Check the download against SHA256SUMS, and that it was built by this repository's release workflow:
sha256sum --ignore-missing -c SHA256SUMS
gh attestation verify <file> --repo Azentrius/cockpit-cronjobsCron Jobs 2.6.0
Packages: Cron Jobs comes as cockpit-cronjobs (.deb and .rpm) from the Azentrius package
repository, packages.azentrius.de, and Cockpit lists it under Applications.
- Packages: every release has
cockpit-cronjobs_VERSION-1_all.deband
cockpit-cronjobs-VERSION-1.noarch.rpmnext to the archive, inSHA256SUMSand with a signed build
provenance. They install the page to/usr/share/cockpit/cronjobsand needcockpit-bridgeand a
cron daemon (cronor anothercron-daemonon Debian and Ubuntu,cronieorcronin RPM). The
builds are reproducible: CI builds them twice and compares the bytes, then installs them on Debian 13
and Fedora 43. - Cockpit's Applications page: the packages carry AppStream data (
de.azentrius.cronjobs, English
and German). With the package repository set up (one package,azentrius-repository), Cockpit lists
Cron Jobs under Applications and installs it with a click, and the system's updates keep it current.
The repository takes a package only after checking that this repository's release workflow built it. - Installation: the README installs from the package repository, from the files of a release or
from the source, and says how to switch from an earlier installation.
Install
From the Azentrius package repository: set up https://packages.azentrius.de once, then install Cron Jobs in Cockpit under Applications, or with sudo apt install cockpit-cronjobs or sudo dnf install cockpit-cronjobs. The repository takes this release within an hour.
From the files of this release: Debian and Ubuntu sudo apt install ./cockpit-cronjobs_2.6.0-1_all.deb, Fedora, RHEL and openSUSE sudo dnf install ./cockpit-cronjobs-2.6.0-1.noarch.rpm.
Other systems: sudo tar -xzf cockpit-cronjobs-2.6.0.tar.gz -C /usr/share/cockpit.
Check the download against SHA256SUMS, and that it was built by this repository's release workflow:
sha256sum --ignore-missing -c SHA256SUMS
gh attestation verify <file> --repo Azentrius/cockpit-cronjobsCron Jobs 2.5.0
Results at a glance: the latest result of every recorded job and systemd timer at the top of the overview,
failures first, and the runs of every timer from the journal.
- The latest results: a new card at the top of the overview lists the last run of every recorded job
(in every crontab the page shows) and of every active systemd timer: failed and aborted ones first,
newest first, then those running, then the successful ones, folded away behind a button. A result opens
the runs of its job or timer. The page reads the runs and the timers' results again every half minute,
so a failure shows within a minute without reloading; coming back to the page with a dialog open, it
reads them too. - Runs from the journal: every systemd timer gets the runs dialog of a recorded job, from the journal
of its service: start, duration, result and output. The systemd timers tab has a button for it. A job
converted to a timer keeps its history: its row shows the timer's last run, and its runs dialog lists
the runs recorded before the conversion together with those of its service since. - The last run of a timer is the later of its last trigger and the last start of its service, so a
service started by hand shows as run. - Fix: jobs with rare schedules, such as yearly ones or those on the 29th of February, could not be
converted to a systemd timer: the check compared five runs, but computed cron's own only 800 days ahead.
It now computes them up to the last run systemd lists. - Tests: the end-to-end test lets a recorded job and a timer fail under the real cron and systemd and
finds both in the latest results without reloading, reads runs from the real journal, and converts a
yearly and a leap day job; the journal parser is tested with real output of systemd 259.
Install
curl -LO https://github.com/Azentrius/cockpit-cronjobs/releases/download/v2.5.0/cockpit-cronjobs-2.5.0.tar.gz
curl -LO https://github.com/Azentrius/cockpit-cronjobs/releases/download/v2.5.0/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
sudo tar -xzf cockpit-cronjobs-2.5.0.tar.gz -C /usr/share/cockpitCheck that the archive was built by this repository's release workflow:
gh attestation verify cockpit-cronjobs-2.5.0.tar.gz --repo Azentrius/cockpit-cronjobsCron Jobs 2.4.0
Crontabs of other users, with administrative access: changed, run, recorded and converted with the same
safety as root's. Run now and conversions now give a job the environment cron gives it.
- Crontabs of other users: with administrative access, every other user's crontab gets a card of its
own on the overview and is changed the same way as root's: throughcrontab -u USERin one locked
step, after a backup of its own (the last ten in/var/lib/cockpit-cronjobs/backups/users/USER/),
which can be compared and restored like root's. Without administrative access they are not shown at
all./etc/crontaband/etc/cron.dstay read-only. - Run now as that user: another user's job runs as that user (through
runuser), in the user's
home, with cron's environment for that user. - Recording for other users: the run recorder (version 2; the page installs it again) records a job
of another user as that user, in/var/lib/cockpit-cronjobs/users/USER/runs/, a directory that
belongs to the user;/var/lib/cockpit-cronjobsand itsusersdirectory become mode 711. Cron Jobs
reads output and removes runs there as that user, and lists only what has the form of runs. - Conversion for other users: the timer runs the job with
User=USER, in the user's home. Units
name the crontab they come from, and back to cron removes only units converted from the crontab whose
note it follows, so a note a user writes into their own crontab cannot reach anyone else's timer. The
systemd timers tab names the crontab a timer came from. - Cron's environment: run now and conversions read from the server how cron builds a job's
environment (PAM's variables from/etc/environmentand, on Debian and Ubuntu, the locale; the
crontab's variables; cron's own) and use exactly that. On Ubuntu, which starts cron with-P,PATH
now comes from/etc/environmentas under cron, andUSERis no longer set where cron sets none. A
converted unit lists the variables and unsets what systemd would add on its own. The run dialog names
the other variables it sets. - Tests: the end-to-end test covers a second user for editing, backups, run now, recording and
conversion, compares the whole environment of a job under cron with run now and with a converted
unit, and tries a link in a user's run directory and a forged conversion note.
Install
curl -LO https://github.com/Azentrius/cockpit-cronjobs/releases/download/v2.4.0/cockpit-cronjobs-2.4.0.tar.gz
curl -LO https://github.com/Azentrius/cockpit-cronjobs/releases/download/v2.4.0/SHA256SUMS
sha256sum --ignore-missing -c SHA256SUMS
sudo tar -xzf cockpit-cronjobs-2.4.0.tar.gz -C /usr/share/cockpitCheck that the archive was built by this repository's release workflow:
gh attestation verify cockpit-cronjobs-2.4.0.tar.gz --repo Azentrius/cockpit-cronjobs