1375 lines
35 KiB
JSON
1375 lines
35 KiB
JSON
{
|
|
"summary": {
|
|
"cron_exact": "73/91 (80.2%)",
|
|
"cron_valid": "87/91 (95.6%)",
|
|
"systemd_exact": "71/91 (78.0%)",
|
|
"overall": "63/91 (69.2%)"
|
|
},
|
|
"results": [
|
|
{
|
|
"nl": "every Tuesday at 3am except December",
|
|
"expected": {
|
|
"cron": "0 3 * 1-11 2",
|
|
"systemd": "Tue *-01..11-* 03:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 3 * 1-11 2",
|
|
"systemd": "Tue *-01..11-* 03:00:00",
|
|
"note": "Months 1-11 only excludes December."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "the last Friday of every month at 11pm",
|
|
"expected": {
|
|
"cron": "0 23 * * 5",
|
|
"systemd": "Fri *-*-25..31 23:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 23 25-31 * 5",
|
|
"systemd": "Fri *-*-25..31 23:00:00",
|
|
"note": "Last Friday of month = DOM 25-31 + Fri (last 7 calendar days always have a Fri)."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every other Monday at noon",
|
|
"expected": {
|
|
"cron": "0 12 * * 1",
|
|
"systemd": "Mon *-*-* 12:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 12 * * 1",
|
|
"systemd": "Mon *-*-* 12:00:00",
|
|
"note": "Cron cannot express 'every other week' \u2014 runs every Monday, gate in script with week-of-year %2."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "first Sunday of the month at midnight",
|
|
"expected": {
|
|
"cron": "0 0 1-7 * 0",
|
|
"systemd": "Sun *-*-01..07 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 1-7 * 0",
|
|
"systemd": "Sun *-*-01..07 00:00:00",
|
|
"note": "Day-of-month 1-7 + specific weekday = first occurrence in the month."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "second Tuesday of every month at 9am",
|
|
"expected": {
|
|
"cron": "0 9 8-14 * 2",
|
|
"systemd": "Tue *-*-08..14 09:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9 15-21 * 2",
|
|
"systemd": "Tue *-*-15..21 09:00:00",
|
|
"note": "Second Tuesday of month = DOM 15-21 + Tue."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "third Thursday of every month at 2pm",
|
|
"expected": {
|
|
"cron": "0 14 15-21 * 4",
|
|
"systemd": "Thu *-*-15..21 14:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 14 15-21 * 4",
|
|
"systemd": "Thu *-*-15..21 14:00:00",
|
|
"note": "DOM 15-21 + Thu = third Thursday of the month."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Friday the 13th at midnight",
|
|
"expected": {
|
|
"cron": "0 0 13 * 5",
|
|
"systemd": "Fri *-*-13 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 13 * 5",
|
|
"systemd": "Fri *-*-13 00:00:00",
|
|
"note": "Vixie cron OR-matches DOM and DOW; use systemd or guard with a date check."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 30 seconds",
|
|
"expected": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:0/30"
|
|
},
|
|
"got": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:0/30",
|
|
"note": "Cron has no sub-minute granularity \u2014 runs every minute."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 10 seconds",
|
|
"expected": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:0/10"
|
|
},
|
|
"got": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:0/10",
|
|
"note": "Cron cannot do sub-minute. systemd: 0/10."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 5 seconds",
|
|
"expected": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:0/5"
|
|
},
|
|
"got": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:0/5",
|
|
"note": "Cron cannot do sub-minute."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every second",
|
|
"expected": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:*"
|
|
},
|
|
"got": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:0",
|
|
"note": "Cron has no second-level granularity. Even systemd is not ideal \u2014 consider a long-running daemon."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Christmas at 7am",
|
|
"expected": {
|
|
"cron": "0 7 25 12 *",
|
|
"systemd": "*-12-25 07:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 7 25 12 *",
|
|
"systemd": "*-12-25 07:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every New Year's Day at midnight",
|
|
"expected": {
|
|
"cron": "0 0 1 1 *",
|
|
"systemd": "*-01-01 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 1 1 *",
|
|
"systemd": "*-01-01 00:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every New Year's Eve at 11:59pm",
|
|
"expected": {
|
|
"cron": "59 23 31 12 *",
|
|
"systemd": "*-12-31 23:59:00"
|
|
},
|
|
"got": {
|
|
"cron": "59 23 31 12 *",
|
|
"systemd": "*-12-31 23:59:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Halloween at 6pm",
|
|
"expected": {
|
|
"cron": "0 18 31 10 *",
|
|
"systemd": "*-10-31 18:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 18 31 10 *",
|
|
"systemd": "*-10-31 18:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "Independence Day at noon",
|
|
"expected": {
|
|
"cron": "0 12 4 7 *",
|
|
"systemd": "*-07-04 12:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 12 4 7 *",
|
|
"systemd": "*-07-04 12:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Valentine's Day at 9am",
|
|
"expected": {
|
|
"cron": "0 9 14 2 *",
|
|
"systemd": "*-02-14 09:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9 14 2 *",
|
|
"systemd": "*-02-14 09:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every leap day at midnight",
|
|
"expected": {
|
|
"cron": "0 0 29 2 *",
|
|
"systemd": "*-02-29 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 29 2 *",
|
|
"systemd": "*-02-29 00:00:00",
|
|
"note": "Runs only in leap years."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every April Fools' Day at 8am",
|
|
"expected": {
|
|
"cron": "0 8 1 4 *",
|
|
"systemd": "*-04-01 08:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 8 1 4 *",
|
|
"systemd": "*-04-01 08:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "Black Friday at 6am",
|
|
"expected": {
|
|
"cron": "0 6 23-29 11 5",
|
|
"systemd": "Fri *-11-23..29 06:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 6 23 11 *",
|
|
"systemd": "*-11-23 06:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Thanksgiving at 11am",
|
|
"expected": {
|
|
"cron": "0 11 22-28 11 4",
|
|
"systemd": "Thu *-11-22..28 11:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 11 22 11 *",
|
|
"systemd": "*-11-22 11:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every morning",
|
|
"expected": {
|
|
"cron": "0 7 * * *",
|
|
"systemd": "*-*-* 07:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 7 * * *",
|
|
"systemd": "*-*-* 07:00:00",
|
|
"note": "'first thing' interpreted as 7am."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every night before bed",
|
|
"expected": {
|
|
"cron": "0 22 * * *",
|
|
"systemd": "*-*-* 22:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 22 * * *",
|
|
"systemd": "*-*-* 22:00:00",
|
|
"note": "'before bed' interpreted as 10pm."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "first thing in the morning",
|
|
"expected": {
|
|
"cron": "0 6 * * *",
|
|
"systemd": "*-*-* 06:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 6 * * *",
|
|
"systemd": "*-*-* 06:00:00",
|
|
"note": "'first thing in the morning' interpreted as 6am."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "at lunchtime every weekday",
|
|
"expected": {
|
|
"cron": "0 12 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 12:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 12 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 12:00:00",
|
|
"note": "'lunchtime' interpreted as noon weekdays."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "at the crack of dawn",
|
|
"expected": {
|
|
"cron": "0 5 * * *",
|
|
"systemd": "*-*-* 05:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 5 * * *",
|
|
"systemd": "*-*-* 05:00:00",
|
|
"note": "'crack of dawn' interpreted as 5am."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every day at end of business",
|
|
"expected": {
|
|
"cron": "0 17 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 17:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 17 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 17:00:00",
|
|
"note": "'end of day' interpreted as 5pm weekdays."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "early morning every Sunday",
|
|
"expected": {
|
|
"cron": "0 5 * * 0",
|
|
"systemd": "Sun *-*-* 05:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 5 * * 0",
|
|
"systemd": "Sun *-*-* 5:00:00",
|
|
"note": "'first thing' interpreted as 5am."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every afternoon",
|
|
"expected": {
|
|
"cron": "0 14 * * *",
|
|
"systemd": "*-*-* 14:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 14 * * *",
|
|
"systemd": "*-*-* 14:00:00",
|
|
"note": "'afternoon' interpreted as 2pm."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every evening",
|
|
"expected": {
|
|
"cron": "0 19 * * *",
|
|
"systemd": "*-*-* 19:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 19 * * *",
|
|
"systemd": "*-*-* 19:00:00",
|
|
"note": "'evening' interpreted as 7pm."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "around midnight every Friday",
|
|
"expected": {
|
|
"cron": "0 0 * * 5",
|
|
"systemd": "Fri *-*-* 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 * * 5",
|
|
"systemd": "Fri *-*-* 00:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every day except Sunday at 8am",
|
|
"expected": {
|
|
"cron": "0 8 * * 1-6",
|
|
"systemd": "Mon..Sat *-*-* 08:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 8 * * 1-6",
|
|
"systemd": "Mon..Sat *-*-* 08:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every minute except between 2am and 3am",
|
|
"expected": {
|
|
"cron": "* 0-1,3-23 * * *",
|
|
"systemd": "*-*-* 00..01,03..23:*:00"
|
|
},
|
|
"got": {
|
|
"cron": "* 0-1,3-23 * * *",
|
|
"systemd": "*-*-* 00..01..03..23:*:00",
|
|
"note": "Skip the 2-3 AM hour for backups."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every hour except midnight",
|
|
"expected": {
|
|
"cron": "0 1-23 * * *",
|
|
"systemd": "*-*-* 01..23:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 1-23 * * *",
|
|
"systemd": "*-*-* 01..03:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every day at 9am, but not on weekends",
|
|
"expected": {
|
|
"cron": "0 9 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 09:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 09:00:00",
|
|
"note": "'Not weekends' = Mon-Fri only."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Tuesday at 4pm except in summer",
|
|
"expected": {
|
|
"cron": "0 16 * 1-5,9-12 2",
|
|
"systemd": "Tue *-01..05,09..12-* 16:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 16 * 1-7,9-12 2",
|
|
"systemd": "Tue *-01..07,09..12-* 16:00:00",
|
|
"note": "All months except August (month 8)."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Sunday at 4am except in July",
|
|
"expected": {
|
|
"cron": "0 4 * 1-6,8-12 0",
|
|
"systemd": "Sun *-01..06,08..12-* 04:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 4 * 1-6,8-12 0",
|
|
"systemd": "Sun *-01..06,08..12-* 04:00:00",
|
|
"note": "Every Sunday at 04:00 for months 1-6, August-December (last day of month = DOM 25-31)."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "any day except Friday at midnight",
|
|
"expected": {
|
|
"cron": "0 0 * * 0-4,6",
|
|
"systemd": "Sun..Thu,Sat *-*-* 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 * * 0-4,6",
|
|
"systemd": "Sun..Thu,Sat *-*-* 00:00:00",
|
|
"note": "Every day except Friday (DOW 5) at midnight."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Tuesday and Thursday at 9am and 3pm",
|
|
"expected": {
|
|
"cron": "0 9,15 * * 2,4",
|
|
"systemd": "Tue,Thu *-*-* 09,15:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9,15 * * 2,4",
|
|
"systemd": "Tue,Thu *-*-* 09,15:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "9am Monday through Friday, plus 10am on Saturday",
|
|
"expected": {
|
|
"cron": "0 9 * * 1-5\n0 10 * * 6",
|
|
"systemd": "Mon..Fri *-*-* 09:00:00\nSat *-*-* 10:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9 * * 1-5\n0 10 * * 6",
|
|
"systemd": "Mon..Fri *-*-* 09:00:00\nSat *-*-* 10:00:00",
|
|
"note": "Two schedules \u2014 different times for different days."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every weekday at 8am and weekends at 10am",
|
|
"expected": {
|
|
"cron": "0 8 * * 1-5\n0 10 * * 0,6",
|
|
"systemd": "Mon..Fri *-*-* 08:00:00\nSat,Sun *-*-* 10:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 8 * * 1-5\n0 10 * * 0,6",
|
|
"systemd": "Mon..Fri *-*-* 08:00:00\nSat,Sun *-*-* 10:00:00",
|
|
"note": "Two schedules \u2014 earlier weekdays, later weekends."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "twice a day, at 9am and 5pm, every day",
|
|
"expected": {
|
|
"cron": "0 9,17 * * *",
|
|
"systemd": "*-*-* 09,17:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9,17 * * *",
|
|
"systemd": "*-*-* 09,17:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "three times a day at 8am, noon, and 6pm",
|
|
"expected": {
|
|
"cron": "0 8,12,18 * * *",
|
|
"systemd": "*-*-* 08,12,18:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 8,12,18 * * *",
|
|
"systemd": "*-*-* 08,12,18:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every weekday at 9, 12, and 3",
|
|
"expected": {
|
|
"cron": "0 9,12,15 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 09,12,15:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9,12,15 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 9,12,15-*-*",
|
|
"note": "Bare numbers in business context default to AM/PM logically \u2014 9am, noon, 3pm."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 90 minutes",
|
|
"expected": {
|
|
"cron": "0,30 0,3,6,9,12,15,18,21 * * *\n0 1,4,7,10,13,16,19,22 * * *",
|
|
"systemd": "*-*-* 00/1:30/90:00"
|
|
},
|
|
"got": {
|
|
"cron": "0,30 0,3,6,9,12,15,18,21 * * *\n0 6,9,12,15,18,21 * *",
|
|
"systemd": "*-*-* 06..09,12,15,18,21-*-*",
|
|
"note": "Cron has no native 90-min interval; expanded. systemd handles natively."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": false
|
|
},
|
|
{
|
|
"nl": "every 45 minutes",
|
|
"expected": {
|
|
"cron": "0,45 0,3,6,9,12,15,18,21 * * *\n30 1,4,7,10,13,16,19,22 * * *",
|
|
"systemd": "*-*-* *:0/45:00"
|
|
},
|
|
"got": {
|
|
"cron": "*/45 * * * *",
|
|
"systemd": "*-*-* *:45:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 100 minutes",
|
|
"expected": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* 00:00/100:00"
|
|
},
|
|
"got": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:0/100",
|
|
"note": "Cron cannot express intervals that don't align to 0:00. Use a script gate or systemd timer."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 2 hours starting at 1am",
|
|
"expected": {
|
|
"cron": "0 1,3,5,7,9,11,13,15,17,19,21,23 * * *",
|
|
"systemd": "*-*-* 01/2:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0,3,6,9,12,15,18,21 * * *",
|
|
"systemd": "*-*-* 00..03:00/2:00",
|
|
"note": "On the 1st of each month at 00:00."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 4 hours starting at 2am",
|
|
"expected": {
|
|
"cron": "0 2,6,10,14,18,22 * * *",
|
|
"systemd": "*-*-* 02/4:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 2,4,6,8,10,12,14,16,18,20,22,24 * * *",
|
|
"systemd": "*-*-* 02/4:00:00",
|
|
"note": "Cron */4 starts at 00:00."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": true,
|
|
"cron_valid": false
|
|
},
|
|
{
|
|
"nl": "every 3 hours between 6am and midnight",
|
|
"expected": {
|
|
"cron": "0 6,9,12,15,18,21 * * *",
|
|
"systemd": "*-*-* 06..23:00/180:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 6,9,12,15,18,21 * * *",
|
|
"systemd": "*-*-* 06..23:00/3:00",
|
|
"note": "Last fire before midnight \u2014 23:00."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every hour on the half hour",
|
|
"expected": {
|
|
"cron": "30 * * * *",
|
|
"systemd": "*-*-* *:30:00"
|
|
},
|
|
"got": {
|
|
"cron": "30 * * * *",
|
|
"systemd": "*-*-* *:30:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every hour at quarter past",
|
|
"expected": {
|
|
"cron": "15 * * * *",
|
|
"systemd": "*-*-* *:15:00"
|
|
},
|
|
"got": {
|
|
"cron": "15 * * * *",
|
|
"systemd": "*-*-* *:15:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every hour at the 17th minute",
|
|
"expected": {
|
|
"cron": "17 * * * *",
|
|
"systemd": "*-*-* *:17:00"
|
|
},
|
|
"got": {
|
|
"cron": "17 * * * *",
|
|
"systemd": "*-*-* 17:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "at 23 minutes past every hour during the workday",
|
|
"expected": {
|
|
"cron": "23 9-17 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 09..17:23:00"
|
|
},
|
|
"got": {
|
|
"cron": "23 9-17 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 09..17:59:00",
|
|
"note": "9-17 inclusive covers up to 17:59."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "at 3pm UTC every day",
|
|
"expected": {
|
|
"cron": "0 15 * * *",
|
|
"systemd": "*-*-* 15:00:00 UTC"
|
|
},
|
|
"got": {
|
|
"cron": "0 15 * * *",
|
|
"systemd": "*-*-* 15:00:00 UTC",
|
|
"note": "Cron uses system timezone; set TZ=UTC at top of crontab."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "at 9am Eastern Time every weekday",
|
|
"expected": {
|
|
"cron": "0 9 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 09:00:00 America/New_York"
|
|
},
|
|
"got": {
|
|
"cron": "0 9 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 09:00:00 America/New_York",
|
|
"note": "Cron has no built-in TZ; set TZ=America/New_York in env."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "5 minutes after every boot",
|
|
"expected": {
|
|
"cron": "@reboot sleep 300 && cmd",
|
|
"systemd": "OnBootSec=5min"
|
|
},
|
|
"got": {
|
|
"cron": "@reboot sleep 30 && cmd",
|
|
"systemd": "OnBootSec=5min",
|
|
"note": "Use OnBootSec= in systemd timers (not OnCalendar)."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "1 hour after the service starts",
|
|
"expected": {
|
|
"cron": "@reboot sleep 3600 && cmd",
|
|
"systemd": "OnUnitActiveSec=1h"
|
|
},
|
|
"got": {
|
|
"cron": "@reboot sleep 336 && cmd",
|
|
"systemd": "OnUnitActiveSec=1h",
|
|
"note": "OnUnitActiveSec= = relative to service activation. systemd-only feature."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "if missed during shutdown, run on next boot",
|
|
"expected": {
|
|
"cron": "0 0 * * *",
|
|
"systemd": "OnCalendar=daily\nPersistent=true"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 * * *",
|
|
"systemd": "OnCalendar=daily\nPersistent=true",
|
|
"note": "Persistent=true is a systemd-specific flag \u2014 runs missed jobs on next boot. Cron has no equivalent."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "with random delay up to 30 minutes, every hour",
|
|
"expected": {
|
|
"cron": "0 * * * * sleep $((RANDOM % 1800))",
|
|
"systemd": "OnCalendar=hourly\nRandomizedDelaySec=30min"
|
|
},
|
|
"got": {
|
|
"cron": "0 * * * *",
|
|
"systemd": "OnCalendar=hourly\nRandomizedDelaySec=30min",
|
|
"note": "RandomizedDelaySec= adds jitter \u2014 systemd-only."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "first weekday of every month at 8am",
|
|
"expected": {
|
|
"cron": "0 8 1-3 * 1-5",
|
|
"systemd": "Mon..Fri *-*-01..03 08:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 8 1-3 * 1-5",
|
|
"systemd": "Mon..Fri *-*-01..03 08:00:00",
|
|
"note": "First weekday of month = DOM 1-3 + Mon-Fri (by day 4 there's always been a weekday)."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "at the top of every hour",
|
|
"expected": {
|
|
"cron": "0 * * * *",
|
|
"systemd": "*-*-* *:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0:00 * * * *",
|
|
"systemd": "*-*-* 00:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": false
|
|
},
|
|
{
|
|
"nl": "every 15 minutes",
|
|
"expected": {
|
|
"cron": "*/15 * * * *",
|
|
"systemd": "*-*-* *:0/15:00"
|
|
},
|
|
"got": {
|
|
"cron": "*/15 * * * *",
|
|
"systemd": "*-*-* *:0/15:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 5 minutes",
|
|
"expected": {
|
|
"cron": "*/5 * * * *",
|
|
"systemd": "*-*-* *:0/5:00"
|
|
},
|
|
"got": {
|
|
"cron": "*/5 * * * *",
|
|
"systemd": "*-*-* *:0/5:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Sunday at 2:15am",
|
|
"expected": {
|
|
"cron": "15 2 * * 0",
|
|
"systemd": "Sun *-*-* 02:15:00"
|
|
},
|
|
"got": {
|
|
"cron": "15 2 * * 0",
|
|
"systemd": "Sun *-*-* 02:15:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "rotate logs nightly at 3am",
|
|
"expected": {
|
|
"cron": "0 3 * * *",
|
|
"systemd": "*-*-* 03:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 3 * * *",
|
|
"systemd": "*-*-* 03:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "weekly maintenance Sunday at 4am",
|
|
"expected": {
|
|
"cron": "0 4 * * 0",
|
|
"systemd": "Sun *-*-* 04:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 4 * * 0",
|
|
"systemd": "Sun *-*-* 04:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "first day of each quarter at midnight",
|
|
"expected": {
|
|
"cron": "0 0 1 1,4,7,10 *",
|
|
"systemd": "*-01,04,07,10-01 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 1 1,4,7,10 *",
|
|
"systemd": "*-01,04,07,10-01 00:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "last day of each quarter at 6pm",
|
|
"expected": {
|
|
"cron": "0 18 28-31 3,6,9,12 *",
|
|
"systemd": "*-03,06,09,12-* 18:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "30 18 28-31 3,6,9,12 *",
|
|
"systemd": "*-03,06,09,12-* 18:00:00",
|
|
"note": "Last day of quarter \u2014 cron approximates with DOM 28-31, needs date check."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "first Monday of each quarter",
|
|
"expected": {
|
|
"cron": "0 0 1-7 1,4,7,10 1",
|
|
"systemd": "Mon *-01,04,07,10-01..07 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 1-7 1,4,7,10 1",
|
|
"systemd": "Mon *-01,04,07,10-01..07 00:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every fiscal year start (April 1)",
|
|
"expected": {
|
|
"cron": "0 0 1 4 *",
|
|
"systemd": "*-04-01 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 1 4 *",
|
|
"systemd": "*-04-01 00:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "twice an hour",
|
|
"expected": {
|
|
"cron": "0,30 * * * *",
|
|
"systemd": "*-*-* *:00,30:00"
|
|
},
|
|
"got": {
|
|
"cron": "0,30 * * * *",
|
|
"systemd": "*-*-* *:00,30:00",
|
|
"note": "On the hour and half hour. Use list 0,30 not */30 to be explicit."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "four times a day at quarter days",
|
|
"expected": {
|
|
"cron": "0 0,6,12,18 * * *",
|
|
"systemd": "*-*-* 00,06,12,18:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9,15,19,21 * * *",
|
|
"systemd": "*-09,15,19,21-* 09,15,19,21",
|
|
"note": ""
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "biweekly on Friday at 5pm",
|
|
"expected": {
|
|
"cron": "0 17 * * 5",
|
|
"systemd": "Fri *-*-* 17:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 17 * * 5",
|
|
"systemd": "Fri *-*-* 17:00:00",
|
|
"note": "Cron cannot express 'every other Friday' \u2014 runs this Friday; gate in script with day-of-month %2."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "fortnightly on Monday morning",
|
|
"expected": {
|
|
"cron": "0 9 * * 1",
|
|
"systemd": "Mon *-*-* 09:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9 * * 1",
|
|
"systemd": "Mon *-*-* 09:00:00",
|
|
"note": "Fortnightly = every 2 weeks. Cron cannot natively. Gate in script."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every minute between 9am and 5pm on weekdays",
|
|
"expected": {
|
|
"cron": "* 9-16 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 09..16:*:00"
|
|
},
|
|
"got": {
|
|
"cron": "* 9-16 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 09..16:*:00",
|
|
"note": "9-16 inclusive covers 9:00 to 16:59 (just before 5pm)."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 10 minutes from 8am to 6pm exclusive",
|
|
"expected": {
|
|
"cron": "*/10 8-17 * * *",
|
|
"systemd": "*-*-* 08..17:00/10:00"
|
|
},
|
|
"got": {
|
|
"cron": "*/10 8-17 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 08..17:00/10:00",
|
|
"note": "8-17 inclusive covers up to 17:59."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": false,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "at 11:59pm on December 31st",
|
|
"expected": {
|
|
"cron": "59 23 31 12 *",
|
|
"systemd": "*-12-31 23:59:00"
|
|
},
|
|
"got": {
|
|
"cron": "59 23 31 12 *",
|
|
"systemd": "*-12-31 23:59:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "noon on March 1st",
|
|
"expected": {
|
|
"cron": "0 12 1 3 *",
|
|
"systemd": "*-03-01 12:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 12 1 3 *",
|
|
"systemd": "*-03-01 12:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "8am on the 15th of every month",
|
|
"expected": {
|
|
"cron": "0 8 15 * *",
|
|
"systemd": "*-*-15 08:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 8 15 * *",
|
|
"systemd": "*-*-15 08:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Sunday at 6am",
|
|
"expected": {
|
|
"cron": "0 6 * * 0",
|
|
"systemd": "Sun *-*-* 06:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 6 * * 0",
|
|
"systemd": "Sun *-*-* 06:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Saturday night at 11pm",
|
|
"expected": {
|
|
"cron": "0 23 * * 6",
|
|
"systemd": "Sat *-*-* 23:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 23 * * 6",
|
|
"systemd": "Sat *-*-* 23:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every day in March",
|
|
"expected": {
|
|
"cron": "0 0 * 3 *",
|
|
"systemd": "*-03-* 00:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 0 * 3 *",
|
|
"systemd": "*-03-* 00:00:00",
|
|
"note": "Defaults to midnight."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "weekdays in Q1 at 9am",
|
|
"expected": {
|
|
"cron": "0 9 * 1-3 1-5",
|
|
"systemd": "Mon..Fri *-01..03-* 09:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 9 * 1-3 1-5",
|
|
"systemd": "Mon..Fri *-01..03-* 09:00:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every minute on the dot",
|
|
"expected": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:00"
|
|
},
|
|
"got": {
|
|
"cron": "* * * * *",
|
|
"systemd": "*-*-* *:*:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every Friday at 4:20pm",
|
|
"expected": {
|
|
"cron": "20 16 * * 5",
|
|
"systemd": "Fri *-*-* 16:20:00"
|
|
},
|
|
"got": {
|
|
"cron": "20 16 * * 5",
|
|
"systemd": "Fri *-*-* 16:20:00",
|
|
"note": ""
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every prime-numbered minute of every hour",
|
|
"expected": {
|
|
"cron": "2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59 * * * *",
|
|
"systemd": "*-*-* *:02,03,05,07,11,13,17,19,23,29,31,37,41,43,47,53,59:00"
|
|
},
|
|
"got": {
|
|
"cron": "2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59 * * *",
|
|
"systemd": "*-*-* *:02,03,05,07,11,13,17,19,23,29,31,37,41,43,47,53,59:00",
|
|
"note": "Listed primes 0-59."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": true,
|
|
"cron_valid": false
|
|
},
|
|
{
|
|
"nl": "every Monday and Wednesday at 6am from March to October",
|
|
"expected": {
|
|
"cron": "0 6 * 3-10 1,3",
|
|
"systemd": "Mon,Wed *-03..10-* 06:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 6 * 3-10 1,3",
|
|
"systemd": "Mon,Wed *-03..10-* 06:00:00",
|
|
"note": "Mon and Wed at 6am, March through October only."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every 45 minutes during weekday afternoons",
|
|
"expected": {
|
|
"cron": "0,45 12-16 * * 1-5\n30 13,15 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 12..16:00/45:00"
|
|
},
|
|
"got": {
|
|
"cron": "0,45 12-16 * * 1-5",
|
|
"systemd": "Mon..Fri *-*-* 12..16:00/45:00",
|
|
"note": "45-min interval during weekday afternoons; expanded."
|
|
},
|
|
"cron_exact": false,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "every other Wednesday at 7pm",
|
|
"expected": {
|
|
"cron": "0 19 * * 3",
|
|
"systemd": "Wed *-*-* 19:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 19 * * 3",
|
|
"systemd": "Wed *-*-* 19:00:00",
|
|
"note": "Cron cannot express 'every other Wednesday' \u2014 runs every Wednesday at 7pm, gate in script with week-of-year %2."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
},
|
|
{
|
|
"nl": "sunset every Friday (7pm)",
|
|
"expected": {
|
|
"cron": "0 19 * * 5",
|
|
"systemd": "Fri *-*-* 19:00:00"
|
|
},
|
|
"got": {
|
|
"cron": "0 19 * * 5",
|
|
"systemd": "Fri *-*-* 19:00:00",
|
|
"note": "'before bed' interpreted as 7pm."
|
|
},
|
|
"cron_exact": true,
|
|
"systemd_exact": true,
|
|
"cron_valid": true
|
|
}
|
|
]
|
|
} |