A recent OS upgrade rendered the crontab to malfunction on macOS Monterey. It turned out the system just needed a reset of System Preferences > Security & Privacy > Privacy tab, and to make sure cron has full access to disks. Once you flipped that, your crontab should start working. Hope that helps.
cron
AWS LightSail Delete Snapshots
Here’s my script to delete AWS LightSail snapshots. It can delete daily or weekly backups and scheduled via crontab. If you want longer or shorter retention, adjust the expired value. It’s in seconds. 604800 is 1 week. 2592000 is 1 month.
#!/bin/bash current=$(date +%s) if [ $# -eq 0 ]; then exit 1 fi if [[ $1 = 'daily' ]]; then prefix='daily' expired=$(($current-604800)) elif [[ $1 = 'weekly' ]]; then prefix='weekly' expired=$(($current-2592000)) else exit 1 fi snaps='/root/snapshots/snapshots.json' names='/root/snapshots/names.txt' parse='/root/snapshots/parse.txt' logfile='/root/snapshots/snapshots.log' /usr/local/bin/aws lightsail get-instance-snapshots > $snaps cat $snaps | jq -r '.instanceSnapshots[] | .name' > $names cat $names | grep $prefix > $parse while read -r line; do snapshot=$(echo $line | cut -d_ -f3) snapshotname=$line if [ `expr $snapshot + 1 2> /dev/null` ] ; then if [ $snapshot -le $expired ]; then echo 'Deleted: '$snapshotname >> $logfile /usr/local/bin/aws lightsail delete-instance-snapshot \ --instance-snapshot-name $snapshotname else echo 'Nothing: '$snapshotname >> $logfile fi else echo $snapshot is not numeric > /dev/null fi done < $parse echo 'Current time: '$current >> $logfile echo 'Expired time: '$expired >> $logfile echo '-----------------------------------' >> $logfile |
Schedule deletes via crontab.
# run daily at 5am 0 5 * * * /bin/bash /root/snapshots/delete-snapshot.sh daily 2>&1 # run weekly every sunday at 6am 0 6 * * 0 /bin/bash /root/snapshots/delete-snapshot.sh weekly 2>&1 |
AWS LightSail Create Snapshots
Here’s my script to create snapshots of a LightSail instance. Create daily or weekly snapshots.
#!/bin/bash if [ $1 != '' ]; then prefix=$1 timestamp=$(date +%s) snapshotname=$prefix'_web-server_'$timestamp /usr/local/bin/aws lightsail create-instance-snapshot \ --instance-snapshot-name $snapshotname \ --instance-name web-server else echo 'Need one argument. e.g. daily or weekly' fi |
Crontab. Job can be scheduled daily or weekly.
# run daily at 4am 0 4 * * * /bin/bash /root/snapshots/create-snapshot.sh daily 2>&1 # run weekly every sunday at 5am 0 5 * * 0 /bin/bash /root/snapshots/create-snapshot.sh weekly 2>&1 |
Adding to Crontab in Bash
Here’s a neat command to append a job to a crontab within a Bash script.
crontab -l | { cat; echo "0 1 * * * /dir/script.sh > /logs/script.cronlog 2>&1"; } | crontab - |
To validate, perform crontab -l to see if your changes are there.
crontab -l |
Create a Crontab via Script
How do you create a crontab entry via a Bash script? That’s a good question. Here is one solution:
(crontab -l 2>/dev/null; echo "* 11 * * * /path/to/job -with args") | crontab - |
If you want to run it as a specific user, use the following:
(crontab -l -u user 2>/dev/null; echo "* 11 * * * /path/to/job -with args") | crontab - |