SystemD Timers vs. Cron Jobs

📆 · ⏳ 8 min read · ·


While working with linux we often come across tasks where we need to automate recurring tasks. There are two popular tools for achieving this which are Cron Jobs and SystemD Timers.

Let’s take a brief look at what each of these tools is before diving into how to set them up and when to use one over the other.

Cron Jobs

Cron is a time-based job scheduler in Unix-like operating systems. Cron Jobs are the scheduled tasks themselves.

They operate by reading a series of scripts, also known as “Cron tabs”, that specify the tasks and when they should run.

Cron Jobs are versatile and have been the go-to solution for scheduling tasks for a long time.

Setting Up a Cron Job

To set up a Cron Job, you’ll need to understand the structure of a Cron tab, the file where you define your scheduled tasks.

Cron Tab Structure

A Cron tab is a simple text file that contains lines specifying when and what to execute.

Each line has five fields followed by a command

Terminal window
* * * * * command_to_execute
| | | | |
| | | | +----- Day of the week (0 - 6) (Sunday is both 0 and 7)
| | | +------- Month (1 - 12)
| | +--------- Day of the month (1 - 31)
| +----------- Hour (0 - 23)
+------------- Minute (0 - 59)

Here’s a breakdown of each field

  • Minute (0 - 59): The minute when the task should run.
  • Hour (0 - 23): The hour when the task should run.
  • Day of the Month (1 - 31): The day of the month when the task should run.
  • Month (1 - 12): The month when the task should run.
  • Day of the Week (0 - 6): The day of the week when the task should run. (Sunday can be represented as 0 or 7).

Let’s checkout some examples of cron job syntax


To run a script every day at 3:30 PM, you would use the following line in your Cron tab

30 15 * * * /path/to/your/

To run a script every Monday at midnight, you would use

0 0 * * 1 /path/to/your/

To run a script every 15 minutes, you would use

*/15 * * * * /path/to/your/

I always go back to using ↗️ when I want to revisit (and mostly confirm) that I am writing the correct cron syntax

Now that you understand the Cron tab structure, let’s set up a Cron Job step by step.

Edit Your Cron Tab

You can edit your user’s Cron tab using the crontab command

Terminal window
crontab -e

This opens your default text editor, allowing you to add or modify Cron Job entries.

Add a Cron Job Line

Each line in your Cron tab represents a scheduled task. Add a line for your task following the structure explained earlier.

For example, to run a backup script every day at midnight, you’d add

Terminal window
0 0 * * * /path/to/

Save and Exit

Save your changes and exit the text editor. The Cron Job is now scheduled.

Verify Your Cron Jobs

You can view your scheduled Cron Jobs by running

Terminal window
crontab -l

This command lists all your current Cron Jobs.

Cron Job Tips

  • Be cautious with the PATH variable: Cron Jobs often require full paths to commands and scripts because they run in a limited environment. Specify the full paths to avoid issues.

  • Redirect output: It’s a good practice to redirect the output (stdout and stderr) of your Cron Jobs to a log file.

    You can do this by adding >> /path/to/logfile.log 2>&1 at the end of your Cron Job command.

  • Test your commands: Before scheduling a Cron Job, test the command manually to ensure it works as expected.

SystemD Timers

SystemD is a modern init system and service manager for Linux.

SystemD Timers are its equivalent of Cron Jobs. They are timer units that can be used to schedule and control the execution of services or scripts.

SystemD Timers provide more fine-grained control and are often preferred for managing system services.

Setting Up SystemD Timers

SystemD timers consist of two main components: timer units and service units.

Timer units define when and how often a task should be executed, while service units specify what action should be performed when the timer triggers.

This separation of concerns allows for greater flexibility and control.

Creating a Timer Unit

To set up a SystemD timer, you’ll first create a timer unit file. This file defines when and how often your task should run.

Here’s how to do it

Create a Timer Unit File

You can place timer unit files in /etc/systemd/system/ or /etc/systemd/user/ for system-wide or user-specific timers, respectively.

Let’s create a system-wide timer unit file

Terminal window
sudo nano /etc/systemd/system/mytask.timer

Replace mytask with a descriptive name for your timer.

Define Timer Settings

In the timer unit file, specify the timer settings.

For example, to trigger a task every day at 3:30 PM

Description=My Timer
OnCalendar=*-*-* 15:30:00
  • OnCalendar: This line defines when the timer should trigger. In this case, it’s set to 3:30 PM every day.
  • Persistent=true: This ensures that if the system is offline during a scheduled run, the task will be executed when the system is next online.
  • This line specifies that the timer should be enabled when the is activated.

Save and Exit

Save your changes and exit the text editor.

Creating a Service Unit

After creating the timer unit, you’ll need to define the associated service unit.

This service unit specifies what command or script should be executed when the timer triggers.

Create a Service Unit File

Similar to the timer unit file, create a service unit file

Terminal window
sudo nano /etc/systemd/system/mytask.service

Define Service Settings

In the service unit file, specify the command or script you want to run. For example,

Description=My Scheduled Task

Replace the ExecStart line with the command or path to the script you want to execute.

Save and Exit

Save your changes and exit the text editor.

Enabling and Starting the Timer

Reload SystemD

After creating both the timer and service unit files, reload SystemD to recognize the new units

Terminal window
sudo systemctl daemon-reload

Enable the Timer

Enable the timer unit to start automatically at boot

Terminal window
sudo systemctl enable mytask.timer

Start the Timer

Start the timer to begin scheduling your task

Terminal window
sudo systemctl start mytask.timer

Check Timer Status

To check the status of your timer, use

Terminal window
sudo systemctl status mytask.timer

Monitoring Timer Logs

You can view the logs generated by your timer and service units using the journalctl command

Terminal window
sudo journalctl -u mytask.service

This command displays logs related to your task.

Choosing Between Cron Jobs and SystemD Timers

Deciding between Cron Jobs and SystemD Timers for scheduling tasks on your Linux system can significantly impact how you manage automation and periodic tasks.

Both have their strengths and weaknesses, and the choice often comes down to your specific requirements and preferences.

Let’s dive deeper into each option to help you make an informed decision.

Cron Jobs

Cron Jobs have been the go-to task scheduler on Unix-like systems for decades. They are simple to set up and provide basic, time-based scheduling.

Here are some advantages and considerations


  • Ease of Use: Cron syntax is well-known and easy to understand. Scheduling tasks at fixed times, intervals, or using predefined strings like @daily is straightforward.

  • Widely Supported: Cron is available on most Unix-like systems, making your scripts portable.

  • Existing Scripts: If you already have scripts that use Cron, it might be easier to stick with what you know.


  • Limited Flexibility: Cron’s scheduling options are somewhat limited. It’s excellent for daily backups or log rotations but might fall short for complex schedules.

  • No Event-Based Triggering: Cron Jobs rely solely on time triggers. They can’t respond to system events or the completion of other tasks.

  • Logging: Cron doesn’t provide built-in logging for executed tasks, which can make troubleshooting challenging.

SystemD Timers

SystemD Timers are part of the SystemD init system and offer more advanced scheduling capabilities.

Here are some advantages and considerations


  • Event-Based Triggers: SystemD timers can trigger tasks based on various events, such as the completion of another service, socket activation, or path existence. This event-based approach enhances flexibility.

  • Dependency Management: SystemD handles dependencies between services and tasks efficiently. You can ensure that a task only runs when specific conditions are met.

  • Built-in Logging: SystemD provides comprehensive logging of service and timer units, simplifying debugging and monitoring.

  • Better Integration: For services managed by SystemD, using SystemD timers results in better integration and easier management.


  • Learning Curve: SystemD timers have a steeper learning curve than Cron due to their additional complexity.

  • SystemD Dependency: Your system must run SystemD for timers to work. While most modern Linux distributions do, it’s a consideration for older systems or those with specific requirements.

  • User-Specific Timers: While possible, setting up user-specific SystemD timers can be more involved compared to user-specific Cron Jobs.

Choosing the Right One

The choice between Cron Jobs and SystemD Timers ultimately depends on your specific use case, familiarity, and system requirements. Here are some guidelines,

Choose Cron Jobs if: You need simple time-based scheduling, and you’re already familiar with Cron. It’s great for basic tasks like daily backups or log rotations.

Choose SystemD Timers if: You require more advanced scheduling, event-based triggering, or dependency management. SystemD Timers are ideal for complex scenarios and better integration with services managed by SystemD.

Consider Your Comfort Level: Don’t underestimate your comfort level with each option. If you or your team are more familiar with one, it might be the right choice to ensure efficient task management.


In the world of Linux task scheduling, Cron Jobs and SystemD Timers are powerful tools at your disposal. Understanding their differences and when to use each is essential for efficient system automation.

Whether you opt for the traditional simplicity of Cron Jobs or the modern flexibility of SystemD Timers, both can help you streamline your Linux system administration tasks.

You may also like

  • Setup Jellyfin with Hardware Acceleration on Orange Pi 5 (Rockchip RK3558)

    Recently I moved my Jellyfin to an Orange Pi 5 Plus server. The Orange Pi 5 has a Rockchip RK3558 SoC with integrated ARM Mali-G610. This guide will show you how to set up Jellyfin with hardware acceleration on the Orange Pi 5.

  • HTTPS with self-signed certificates for your Homelab services

    In this article we will deep dive into understanding how we can setup HTTPS with self-signed certificates for our Homelab services.This is often required when you are running your own services and you want to access them over HTTPS.

  • Setup Shareable Drive with Samba in Linux

    In this article we will setup a shareable drive in Linux with SMB. We will learn how to setup the share directory using Samba on server and how to mount it on client.