Kusprayitna Blogs

Hidup untuk berbagi ilmu :: IT Linux Windows Database Oracle PHP OpenSource

Mengatasi proses cron yang dieksekusi lebih dari satu kali

Posted by Prayitna Kuswidianta on October 2nd, 2013

Di komputer khsusunya linux, jika kita memerlukan proses otomatisasi maka dapat dilakukan dengan memasukkan perintah eksekusi otomatis melalui cron atau crontab.

Sebagai contoh proses adalah sinkronisasi jam (selain memakai ntpd), proses otomatis setiap jam, harian dan sebagainya.

Contoh kasus yang saya alami adalah, saya mempunyai instalasi moodle (moodle.org) dan diperlukan menjalankan proses admin/cli/cron.php secara rutin untuk melakukan notifikasi ke user dan proses proses lain.

Perintah penambahan di crontab, cukuplah sederhana

# crontab -e

1 */1 * * * php admin/cli/cron.php

Dengan mengabaikan konfigurasi pathnya, perintah cron diatas dapat dijalankan dengan normal diawal -awal waktu. Notifikasi terkirimkan dengan baik dan tidak ada masalah.

Seiring dengan waktu, notifikasi terkirim sampai tiga kali untuk pesan yang sama.

Analisa

Bahwa proses cron berjalan dengan baik dimana dilakukan setiap jam di menit pertama. Pengiriman pesan dilakukan bisa sampai tiga kali untuk pesan yang sama.

1. Uji coba dengan perintah sederhana, hasil menunjukkan bahwa setiap jam selama di menit pertama (detik diabaikan), perintah akan dilakukan terus, yaitu bisa lebih dari satu kali dalam waktu yang bersamaan.

Untuk mengatasi ini, maka diperlukan penguncian proses agar ketika ada proses sebelumnya maka proses yang kedua dan seterusnya akan dibatalkan.

Permalahan ini dapat diselesaikan dengan menggunakan aplikasi flock

flock (util-linux-ng 2.17.2)

Usage: flock [-sxun][-w #] fd#

flock [-sxon][-w #] file [-c] command...

flock [-sxon][-w #] directory [-c] command...

-s  --shared     Get a shared lock

-x  --exclusive  Get an exclusive lock

-u  --unlock     Remove a lock

-n  --nonblock   Fail rather than wait

-w  --timeout    Wait for a limited amount of time

-o  --close      Close file descriptor before running command

-c  --command    Run a single command string through the shell

-h  --help       Display this text

-V  --version    Display version

2. Jika proses perintah di cron cukup pendek, maka dalam rentan menit yang sama tersebut, setelah proses pertama selesai maka akan disusul proses yang kedua. Sehingga yang diharapkan perintah dijalankan cukup satu kali ternyata bisa dijalankan lebih dari satu kali.

Kalau diamati proses admin/cli/cron.php diawal-awal waktu memakan waktu cukup lama, bisa sampai lima menit, akan tetapi sekarang ini bisa diselesaikan dalam waktu kurang dari satu menit.

Permasalahan ini harus diselesaikan salah satu caranya dengan proses menunggu, yaitu apabila proses dijalankan kurang dari satu menit, maka tunggu atau perpanjang waktu proses agar lebih dari satu menit, yaitu dengan menggunakan printah sleep.

Implementasi

Dengan dua solusi diatas, maka perintah cron diubah menjadi sbb:

1 */1 * * * flock -n /var/run/moodle_cron.lck php admin/cli/cron.php; sleep 60s

Leave a Reply

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>