Automating Bash scripts on Linux is essential for system administration tasks, such as installing applications and monitoring system logs. Cron is a job scheduler that runs tasks at specific intervals, while systemd is a service manager that handles applications through service profiles. This guide walks through writing two Bash scripts — one for log monitoring and one for backups — then automating them with a cron job and running one as a persistent systemd service. By the end, you'll have both a scheduled cron job and a managed systemd service running your own Bash scripts automatically.

Prerequisites

Before you begin:

  • Have access to a Ubuntu server as your management workstation.
  • Access the server using SSH as a non-root sudo user.
  • Install a LAMP stack (Apache, MySQL, PHP).

Create Bash Scripts

Bash scripts support multiple commands and functions that define how tasks run in a system. Follow the steps below to create two Bash scripts: one to back up critical web application files, and one to monitor system logs for errors.

1. Switch to your user's home directory:

$ cd 

2. Create a new log-monitor.sh script:

$ nano log-monitor.sh 

3. Add the following contents to the log-monitor.sh file:

#!/bin/bash LOG_FILE="/var/log/syslog" ERROR_LOG="/opt/data/error_log.txt" WARNING_LOG="/opt/data/warning_log.txt" tail -F "$LOG_FILE" | while read line; do if echo "$line" | grep -q "error"; then echo "$line" >> "$ERROR_LOG" elif echo "$line" | grep -q "warning"; then echo "$line" >> "$WARNING_LOG" fi done 

Save and close the file. This script creates error_log.txt and warning_log.txt files in the /opt/data directory, filtering results from /var/log/syslog using a while loop. It writes each new line to the respective error or warning file as it appears.

4. Create another script named backup.sh:

$ nano backup.sh 

5. Add the following contents to the file:

#!/bin/bash DB_USER="user" DB_PASSWORD="new-password" DB_NAME="mysql" DB_BACKUP_DIR="mysql_backup" WEB_FILES_DIR="web_backup" mkdir -p "$DB_BACKUP_DIR" mkdir -p "$WEB_FILES_DIR" DATE=$(date +"%Y%m%d_%H%M%S") mysqldump -u"$DB_USER" -p"$DB_PASSWORD" "$DB_NAME" > "$DB_BACKUP_DIR/db_backup_$DATE.sql" echo "MySQL backup completed: $DB_BACKUP_DIR/db_backup_$DATE.sql" tar -czf "$WEB_FILES_DIR/web_backup_$DATE.tar.gz" /var/www/html echo "Web application backup completed: $WEB_FILES_DIR/web_backup_$DATE.tar.gz" 

Save and close the file. This script connects to the MySQL database server using the DB_... variables, then creates mysql_backup and web_backup directories to store the database and web application backups.

6. Move the Bash scripts to a system-wide directory like /opt:

$ sudo cp backup.sh log-monitor.sh /opt/ 

7. Create a new data directory under the system-wide directory:

$ sudo mkdir -p /opt/data 

8. Change the directory permissions to 777 to allow all users to write files:

$ sudo chmod 777 /opt/data 

Automate the Bash Script Using Cron

Cron creates jobs you can use to schedule and automatically run a Bash script at specific intervals. Follow the steps below to automate the backup.sh script to back up the MySQL database and web application files daily.

1. Open the crontab editor:

$ crontab -e 

Select your desired text editor when prompted — for example, select 1 to choose the nano text editor.

2. Add the following directive at the end of the file:

0 2 * * * /opt/backup.sh 

Save and close the file. This cron job runs backup.sh daily at 2:00 A.M. In the job:

  • 0: Runs the script at the start of a minute. Set a value between 0 and 59.
  • 2: Runs the script at 2:00 A.M. Specify an hour between 0 and 23.
  • *: Runs the script every day of the month. Specify a day between 1 and 31.
  • *: Runs the script every month. Specify a month between 1 and 12.
  • *: Runs the script daily. Specify a day of the week between 0 and 7.

3. List all cron jobs and verify the new task is available:

$ crontab -l 

Output:

#  # For more information see the manual pages of crontab(5) and cron(8) #  # m h dom mon dow command 0 2 * * * ~/backup.sh 

Automate the Bash Script as a System Service Using Systemd

Systemd starts system services automatically at boot and offers options for stopping and restarting them. Follow the steps below to set up the log-monitoring script as a system service.

1. Create a new system service file:

$ sudo nano /etc/systemd/system/logmonitor.service 

2. Add the following contents to the logmonitor.service file:

[Unit] Description= Automatic System Logs Monitoring and Filtering After=network.target [Service] ExecStart=bash /opt/log-monitor.sh Restart=always [Install] WantedBy=multi-user.target 

Save and close the file. This service configuration runs the log-monitor.sh script from /opt to monitor and filter log entries in /var/log/syslog.

3. Reload systemd to apply the service file changes:

$ sudo systemctl daemon-reload 

4. Enable the new system service to automatically start at boot:

$ sudo systemctl enable logmonitor.service 

Output:

Created symlink /etc/systemd/system/multi-user.target.wants/logmonitor.service → /etc/systemd/system/logmonitor.service. 

5. Start the system service:

$ sudo systemctl start logmonitor 

6. View the system service status and verify it's running:

$ sudo systemctl status logmonitor 

Output:

● logmonitor.service - Automatic System Logs Monitoring and Filtering Loaded: loaded (/etc/systemd/system/logmonitor.service; enabled; preset: enabled) Active: active (running) since Wed 2024-11-06 13:20:07 UTC; 11s ago Main PID: 14293 (bash) Tasks: 3 (limit: 1062) Memory: 784.0K (peak: 1.5M) CPU: 40ms CGroup: /system.slice/logmonitor.service ├─14293 bash /opt/log-monitor.sh ├─14308 tail -F /var/log/syslog └─14309 bash /opt/log-monitor.sh Nov 06 13:20:07 Linux-server systemd[1]: Started logmonitor.service - Automatic System Logs Monitoring and Filtering. 

7. Run the following commands to simulate new error and warning entries in /var/log/syslog:

$ logger -p user.err "This is a simulated error log message from MySQL" $ logger -p user.err "This is a simulated warning log message from Apache" $ logger -p user.err "This is a simulated error log message from PHP" $ logger -p user.err "This is a simulated Warning log message from MySQL" 

8. List all files in /opt/data and verify that error_log.txt and warning_log.txt are available:

$ ls /opt/data 

Output:

error_log.txt warning_log.txt 

9. View the error_log.txt file and verify that only error entries are present:

$ cat error.log 

Output:

2024-11-06T13:33:48.010096+00:00 Server linuxuser: This is a simulated error log message from MySQL 2024-11-06T13:33:48.010096+00:00 Server linuxuser: This is a simulated error log message from PHP 

Next Steps

  • Add more granular filters (by service name or severity) to log-monitor.sh
  • Extend backup.sh with retention logic to prune old backups automatically
  • Ship backups to remote or off-site storage so they survive a full server loss
  • Add alerting (email or webhook) when new entries land in error_log.txt

For the full guide with additional tips, visit the original article on Vultr Docs.