Working with cron jobs on Linux systems can be intimidating for newcomers and tedious even for experienced users. Today, I'm sharing a simple yet powerful Bash Task Scheduler that provides a clean interface for managing scheduled tasks without needing to remember crontab's syntax.
The Problem
If you've ever tried to schedule recurring tasks on a Unix-based system, you've likely encountered crontab. While powerful, the crontab syntax isn't particularly intuitive:
# ┌───────────── minute (0 - 59) # │ ┌───────────── hour (0 - 23) # │ │ ┌───────────── day of the month (1 - 31) # │ │ │ ┌───────────── month (1 - 12) # │ │ │ │ ┌───────────── day of the week (0 - 6) (Sunday to Saturday) # │ │ │ │ │ # │ │ │ │ │ # * * * * * command to execute
For someone who doesn't work with cron regularly, this can lead to errors and frustration. Even for regular users, it's easy to make a mistake when directly editing the crontab file.
The Solution
I created a Bash script that wraps around crontab to provide a user-friendly interface for scheduling tasks. The script offers:
- A clean menu-driven interface
- Simple options for common scheduling patterns
- The ability to view, add, and remove tasks easily
- No external dependencies beyond standard Unix utilities
Let's walk through how it works.
How the Script Works
Core Functionality
The script is structured around four main functions:
-
display_header
- Creates a consistent UI experience -
display_tasks
- Lists all currently scheduled tasks -
add_task
- Guides users through adding a new task -
remove_task
- Allows users to remove existing tasks
These functions are tied together by a simple menu loop that provides the main interface.
Task Display
When displaying tasks, the script filters out comments from the crontab output and adds line numbers for easier reference:
# Check if crontab exists if crontab -l 2>/dev/null | grep -v "^#" | grep -q .; then # Display tasks with line numbers crontab -l | grep -v "^#" | grep . | nl -w2 -s') ' else echo "No tasks currently scheduled." fi
This gives users a clear view of their scheduled tasks without the clutter of comments or empty lines.
Adding Tasks
The task creation process is where this script really shines. Instead of requiring users to construct cron expressions manually, it offers pre-configured options:
echo "Please select the schedule type:" echo "1) Hourly" echo "2) Daily" echo "3) Weekly" echo "4) Custom (Advanced)"
For example, if a user wants a task to run daily, the script will automatically generate a cron expression like 34 12 * * *
(running at 12:34 PM every day).
For those who know crontab syntax, there's still a custom option to enter a specific cron expression.
Task Management
When it comes to removing tasks, the script displays each task with a number, allowing users to simply enter the number of the task they want to remove:
# Display tasks with line numbers crontab -l | grep -v "^#" | grep . | nl -w2 -s') ' echo read -p "Enter the number of the task to remove (0 to cancel): " task_number
The script then handles the removal by creating a temporary crontab file without the selected task and applying it.
The Code
Here's the full script for the Bash Task Scheduler:
#!/bin/bash # Task Scheduler using Bash # This script allows for managing scheduled tasks using crontab # Function to display header display_header() { clear echo "=====================================" echo " BASH TASK SCHEDULER " echo "=====================================" echo } # Function to display all scheduled tasks display_tasks() { display_header echo "CURRENTLY SCHEDULED TASKS:" echo "=====================================" # Check if crontab exists if crontab -l 2>/dev/null | grep -v "^#" | grep -q .; then # Display tasks with line numbers crontab -l | grep -v "^#" | grep . | nl -w2 -s') ' else echo "No tasks currently scheduled." fi echo echo "Press Enter to continue..." read -r } # Function to add a new task add_task() { display_header echo "ADD NEW SCHEDULED TASK" echo "=====================================" echo echo "Please select the schedule type:" echo "1) Hourly" echo "2) Daily" echo "3) Weekly" echo "4) Custom (Advanced)" echo "5) Return to main menu" echo read -p "Enter your choice (1-5): " schedule_type case $schedule_type in 1) # Hourly minute=$(( RANDOM % 60 )) cron_time="$minute * * * *" timing_desc="Hourly at $minute minutes past the hour" ;; 2) # Daily minute=$(( RANDOM % 60 )) hour=$(( RANDOM % 24 )) cron_time="$minute $hour * * *" timing_desc="Daily at $hour:$minute" ;; 3) # Weekly minute=$(( RANDOM % 60 )) hour=$(( RANDOM % 24 )) day_of_week=$(( RANDOM % 7 )) day_names=("Sunday" "Monday" "Tuesday" "Wednesday" "Thursday" "Friday" "Saturday") cron_time="$minute $hour * * $day_of_week" timing_desc="Weekly on ${day_names[$day_of_week]} at $hour:$minute" ;; 4) # Custom echo read -p "Enter cron expression (e.g., '30 2 * * 1' for Monday at 2:30 AM): " cron_time timing_desc="Custom schedule: $cron_time" ;; 5) # Return to main menu return ;; *) echo "Invalid selection. Please try again." sleep 2 add_task return ;; esac # Get the command to execute echo echo "Schedule: $timing_desc" echo read -p "Enter the command to execute: " task_command if [ -z "$task_command" ]; then echo "Command cannot be empty. Task not added." sleep 2 return fi # Add task to crontab (crontab -l 2>/dev/null; echo "$cron_time $task_command # Scheduled via Task Scheduler") | crontab - echo echo "Task added successfully!" echo "Schedule: $timing_desc" echo "Command: $task_command" echo echo "Press Enter to continue..." read -r } # Function to remove a task remove_task() { display_header echo "REMOVE SCHEDULED TASK" echo "=====================================" echo # Check if crontab exists if ! crontab -l 2>/dev/null | grep -v "^#" | grep -q .; then echo "No tasks currently scheduled." echo echo "Press Enter to continue..." read -r return fi # Display tasks with line numbers crontab -l | grep -v "^#" | grep . | nl -w2 -s') ' echo read -p "Enter the number of the task to remove (0 to cancel): " task_number if [ "$task_number" -eq 0 ]; then return fi # Get the total number of tasks task_count=$(crontab -l | grep -v "^#" | grep . | wc -l) if [ "$task_number" -gt 0 ] && [ "$task_number" -le "$task_count" ]; then # Create a temporary file with all tasks except the one to be removed crontab -l | grep -v "^#" | grep . | awk "NR != $task_number" > /tmp/crontab.tmp # Update crontab with the modified content crontab /tmp/crontab.tmp rm /tmp/crontab.tmp echo echo "Task removed successfully!" else echo echo "Invalid task number. No tasks were removed." fi echo echo "Press Enter to continue..." read -r } # Main menu loop while true; do display_header echo "MAIN MENU" echo "=====================================" echo "1) Display scheduled tasks" echo "2) Add a new task" echo "3) Remove a task" echo "4) Exit" echo read -p "Enter your choice (1-4): " choice case $choice in 1) display_tasks ;; 2) add_task ;; 3) remove_task ;; 4) echo "Exiting Task Scheduler. Goodbye!" exit 0 ;; *) echo "Invalid selection. Please try again." sleep 1 ;; esac done
Key Technical Insights
Random Scheduling
One interesting aspect of the script is how it handles timing. Rather than asking users to specify exact times for recurring tasks (which can be tedious), it uses Bash's RANDOM
function to select times:
minute=$(( RANDOM % 60 )) hour=$(( RANDOM % 24 )) day_of_week=$(( RANDOM % 7 ))
This is particularly useful for tasks that need to run regularly but don't require specific timing. It also helps distribute system load by avoiding having all tasks run at common times like the top of the hour.
Temporary Files
The task removal process uses a temporary file to modify the crontab:
crontab -l | grep -v "^#" | grep . | awk "NR != $task_number" > /tmp/crontab.tmp crontab /tmp/crontab.tmp rm /tmp/crontab.tmp
This approach allows us to manipulate the crontab content safely before applying changes.
Potential Improvements
While this script works well for basic task scheduling, there are several enhancements that could make it even better:
- Better time selection - Allow users to specify exact times rather than relying on random values
- Environment variable support - Add functionality to set environment variables for tasks
- Output redirection - Make it easy to redirect task output to logs
- Task groups - Add the ability to group related tasks and manage them together
- Backup and restore - Add options to back up the current crontab before making changes
Conclusion
The Bash Task Scheduler demonstrates how a relatively simple script can significantly improve user experience for a common administrative task. By providing a clean interface for crontab management, it makes task scheduling accessible to users of all skill levels.
Refer t his repo for full setup https://github.com/Harivelu0/shellscript-projects/tree/main/Task_scheduler
What other common command-line tasks would benefit from a more user-friendly interface? Let me know in the comments!
Top comments (0)