Membuat Script Bash Untuk Multiple RClone Backup Agar Sequential Dengan Cron Job
Masih seputar RClone, pada artikel Cara Backup Database dan Website Otomatis Dengan Cronjob dan Rclone Debian Server. kita sudah berhasil melakukan backup dari server ke layanan cloud, namun jika file yang akan kita pindah sangat besar maka proses rclone akan terjadi parallel prosess.
Misalkan kita membuat cronjob untuk memindah data backup website dengan rclone ke layanan cloud pada jam 2 pagi, dan memindah data backup database dengan rclone ke cloud pada jam 3 pagi. settinganya sudah pas, namun apa jadinya jika proses memindah data backup website pada jam 2 pagi belum selesai pada jam 3? jika ternyata belum selesai akan terjadi parallel proses, rclone akan membuat proses baru untuk memindah file backup database.
Akan berbahaya jika terjadi banyak proses rclone yang berjalan bersamaan dan belum selesai, apalagi jika banyak website dan database, sehingga banyak proses rclone yang dibuat, lebih baik proses rclone dibuat secara sequential dalam satu bash script, dan saat proses bash script di eksekusi, kita akan lock script tersebut agar tidak bisa jalan dua kali atau lebih jika belum selesai, hal ini akan membuat server stabil dan tidak reboot secara paksa.
Membuat Bash Script
pertama kita buat script bash untuk menampung beberapa perintah rclone, lalu script ini nanti diload pada crontab sesuai dengan jadwal eksekusinya.
#buat file baru di home direktori dengan nama backup.sh
touch /home/user/backup.sh
#rubah chmod agar bisa di eksekusi
sudo chmod +x /home/user/backup.sh
#edit script bash backup.sh
nano /home/user/backup.sh
setelah itu masukkan script bash berikut :
#!/bin/bash
#buat pidfile untuk mengetahui apakah proses ini pernah dijalankan
PIDFILE="/home/debian/backup.pid"
# script sedang jalan? jika script ini masih jalan, maka exit
[[ -s $PIDFILE ]] && exit
# jika tidak, artinya tidak ada proses dari script ini, buat pid file baru
echo $BASHPID > $PIDFILE
#tambahkan proses-proses rclone disini
/usr/bin/rclone --exclude="*" --include="*web1*" move /var/backup/website1 NajaGoogleDrive:backup
/usr/bin/rclone --exclude="*" --include="*web2*" move /var/backup/website2 NajaGoogleDrive:backup
/usr/bin/rclone --exclude="*" --include="*web3*" move /var/backup/website3 NajaGoogleDrive:backup
/usr/bin/rclone --exclude="*" --include="*db1*" move /var/backup/db1 NajaGoogleDrive:db
/usr/bin/rclone --exclude="*" --include="*db2*" move /var/backup/db2 NajaGoogleDrive:db
/usr/bin/rclone --exclude="*" --include="*db3*" move /var/backup/db3 NajaGoogleDrive:db
#jika proses sudah selesai jalan secara squential, remove pidfile agar script bisa dieksekusi lagi
rm $PIDFILE
Menambahkan Script Bash Pada Crontab
setelah membuat bash script, saatnya menambahkan ke crontab dan agar dieksekusi sesuai jadwal yang kita inginkan. untuk memahami penulisan crontab dapat dibaca pada artikel Memahami Crontab Parameter untuk Cronjob Penjadwalan Script atau Bash pada Linux Server. jalankan perintah berikut pada terminal :
#edit crontab sebagai root
sudo crontab -e
#tambahkan backup.sh untuk eksekusi script
#jalankan script backup.sh setiap jam 2 pagi
0 2 * * * /home/debian/backup.sh > /home/debian/backup.log 2>&1
> /home/debian/backup.log : menunjukan output standar dari script backup.sh akan dialihkan ke backup.log
2>&1 : menunjukkan bahwa kesalahan standar (2>) dialihkan ke log file yang sama yang ditunjukkan oleh output standar (&1). Jadi, baik output dan kesalahan standar akan dialihkan ke /home/debian/backup.log
*UPDATE 20 Februari 2019
ketika menggunakan filter exclude dan include, akan ada pesan error seperti berikut ini :
ERROR : Using --filter is recommended instead of both --include and --exclude as the order they are parsed in is indeterminate
Tujuan Awalnya saya menggunakan exclude dan include secara bersamaan adalah :
exclude untuk tidak memilih semua file pada direktori tersebut
include untuk memilih file tertentu saja dengan prefix dari include
Namun sudah tidak bisa, sehingga cara agar exclude semua, dan hanya include sebagian menggunakan kombinasi filter dengan include berikut ini :
/usr/bin/rclone move --filter="- *" --include="*web1*" /var/backup/website1 NajaGoogleDrive:backup
/usr/bin/rclone move --filter="- *" --include="*web2*" /var/backup/website2 NajaGoogleDrive:backup
/usr/bin/rclone move --filter="- *" --include="*web3*" /var/backup/website3 NajaGoogleDrive:backup