cron-tz-shared-crontab-risk

CRON_TZ in shared root crontab retroactively shifts ALL existing jobs

During R-TaskFlow M10.T1 (2026-04-17), the spec asked for CRON_TZ=Asia/Kolkata + 30 2 * * * to install a 02:30 IST nightly backup. The VPS root crontab already had ~25 UTC-scheduled jobs with inline comments like “04:00 IST (22:30 UTC)” — adding CRON_TZ= at the top would have silently shifted every pre-existing job by +5:30h.

Rule

Never add or change CRON_TZ= on a shared crontab without auditing every existing line. For a single new job, compute the UTC equivalent:

  • 02:30 IST = 21:00 UTC prior day = 0 21 * * *
  • 18:00 IST = 12:30 UTC = 30 12 * * *

Add an inline comment noting the IST target so future readers understand why the time looks odd in UTC.

Applies to

  • This VPS’s root crontab (convention is UTC)
  • Any shared-crontab scenario where multiple services share the same cron user
  • Multi-service Hostinger VPS deployments

Alternative

If a service genuinely needs its own TZ context: run it as a separate user’s crontab (sudo -u <user> crontab -e), which has its own CRON_TZ scope without affecting root crontab.