flock dapat digunakan untuk mengatur kunci dalam shell scripts. Detail dari opsi penggunaan flock dapat dilihat disini https://man7.org/linux/man-pages/man1/flock.1.html
flock dapat mengunci suatu file ataupun direktori.
Arti mengunci disini bukan berarti file atau direktori tersebut tidak bisa digunakan oleh aplikasi lain, melainkan hanya akan “dihormati” oleh aplikasi flock juga.
Contoh:
Cronjob berikut ini akan di eksekusi per menit. Perintah yang akan dijalankan adalah perintah ‘sleep 70’ yang artinya proses akan terdiam selama 70 detik.
* * * * * flock -w 0 /tmp/test.lock -c 'sleep 70'
Ketika proses tersebut belum selesai, di menit selanjutnya cronjob akan menjalankan kembali perintah tersebut. Namun akan langsung exit karena flock mendeteksi file test.lock sedang dikunci oleh flock lainnya. Dengan adanya opsi -w 0 maka flock tidak akan menunggu file test.lock sampai lepas.
Opsi -w 0 artinya wait timeout selama nol detik alias non-blocking equivalent dengan opsi -n
Namun aplikasi selain flock tidak akan menganggap atau menghormati keberadaan file test.lock tersebut.
Hati-hati ketika menggunakan flock dengan cronjob linux, pastikan kamu tau persis apakah harus menggunakan opsi non-blocking (tidak menunggu), menunggu selamanya, menunggu dengan durasi tertentu. Keputusan ini sangat penting karena jika jadwal di cronjob di jalankan setiap menit maka dengan menggunakan flock tanpa opsi apapun akan terjadi penumpukan proses. Karena setiap menit cronjob akan menjalankan proses flock baru dan flock tanpa opsi akan menunggu sampai file / direktorinya terlepas dari lock. Ini akan menguras memory server dan mengakibatkan server kehabisan memory dan banyak proses yang tidak berjalan dengan baik.
Untuk lebih memahami flock, silahkan lakukan percobaan berikut:
Buka 2 terminal yang mengakses host / server yang sama. Lalu di terminal pertama jalan perintah flock -w 0 /tmp/test.lock -c ‘sleep 10’ dan di terminal yang kedua jalankan perintah flock -w 0 /tmp/test.lock -c ‘echo “Hello World” ‘ berulang kali sampai muncul tulisan “Hello World”.
Dari percobaan tersebut kita bisa lihat behavior atau tingkah laku flock. Perintah yang kedua akan diproses ketika perintah diterminal pertama selesai dijalankan. Ketika perintah pertama masih berjalan, dan perintah kedua di jalankan maka akan langsung berhenti dan tidak memproses perintah echo “Hello World”.
Lalu bagaimana jika di terminal yang pertama, perintah yang dijalankan ada error sehingga proses tidak berjalan sampai selesai. Tenang saja, flock akan tetap mengembalikan respon atau sinyal exit-nya sesuai dengan error yang terjadi didalam prosesnya.
Percobaan selanjutnya adalah sebagai berikut:
Ketika tidak menggunakan opsi -w 0 atau opsi -n. Maka setiap proses flock akan saling menunggu. Perintah-perintah tersebut dijalankan dalam waktu yang sangat berdekatan. Berikut penjelasan gambarnya:
- Terminal 1 – Di eksekusi pertama, menjalankan perintah sleep 20 detik, untuk mendapatkan lock dibutuhkan waktu 0.000004 detik. Sangat cepat karena tidak ada proses flock lain yang menggunakan kunci yang sama.
- Terminal 2 – Baru jalan setelah dapat lock detik ke 18.5
- Terminal 3 – Baru jalan setelah dapat lock detik ke 25.5
- Terminal 4 – Baru jalan setelah dapat lock detik ke 36.3
Dari percobaan ke-2 itu, kita bisa melihat ketika flock tanpa opsi -w 0 atau -n maka prosesnya akan dieksekusi secara berurutan. Menunggu kunci terbuka lalu dapat melanjutkan prosesnya. Karena menggunakan file kunci yang sama.
Di percobaan selanjutnya dengan cara yang sama namun menggunakan opsi -n atau non-blocking.
Pada percobaan ke-3, dapat terlihat ketika satu proses flock sudah dijalankan maka proses flock yang lain yang menggunakan kunci yang sama tidak dapat berjalan atau langsung exit.
Percobaan terakhir yaitu menjalankan flock dengan cronjob lalu melihat daftar proses yang dibuat oleh cronjob. Perintah yang akan dimasukan kedalam cronjob adalah sebagai berikut:
Perintah tersebut akan dijalankan setiap menit oleh cronjob, lalu flock akan mencoba mendapatkan file kunci yaitu /tmp/test.lock. Selanjutnya menjalankan perintah bash yaitu sleep 300, sistem akan terdiam selama 300 detik.
Di tentukan 300 detik agar bisa mensimulasikan proses cronjob berjalan setiap menit yang membuat proses baru, yang akhirnya dalam waktu 20 menit kemudian dapat dilihat pada gambar berikut, ada banyak proses yang dibuat oleh cronjob. Ini bisa terjadi karena ketika menjalankan perintah flock tanpa opsi -n non-blocking ataupun opsi -w 0 ataupun -w 10 (waktu tunggu 10 detik). Memang prosesnya tidak tumpang tindih, namun hal ini dapat menyebabkan server kehabisan memory ketika banyak yang proses yang mengantri lalu menjadi tertidur atau sleeping karena saking lamanya mengantri, menunggu giliran untuk dijalankan oleh flock.
Solusi dari masalah tersebut adalah dengan menambahkan opsi -n ketika menjalankan perintah flock. Sehingga perintahnya menjadi sebagai berikut:
* * * * * flock -n /tmp/test.lock -c 'sleep 300'
Source code flock dapat di unduh di link berikut https://mirrors.edge.kernel.org/pub/linux/utils/util-linux/v2.36/util-linux-2.36.tar.gz
Photo by Kevin Horvat on Unsplash