در صورتی که زمان درنظر گرفته شده برای اجرای یک جاب کافی نباشد(در محیط cron)، به طوری که قبل از اجرای کامل جاب، زمان اجرای مجدد آن فرا برسد، دو یا چند نسخه از یک جاب به صورت همزمان اجرا خواهند شد که این اتفاق ممکن است در مواردی منجر به اختلال در سرویس های دیگر موجود در سرور شود.
برای مثال، فرض کنید قصد داریم اسکریپت زیر را در بازه زمانی 60 ثانیه اجرا کنیم:
[root@avazi ~]# vi myscript
#!/bin/bash
touch /home/oracle/myfile_`date +%H%M%S`
sleep 80
[root@avazi ~]# crontab -e
* * * * * /root/myscript
همانطور که از متن این اسکریپت پیداست، دستور sleep به 80 ثانیه زمان نیاز دارد تا به صورت کامل اجرا شود و با مرور محتویات لاگ مربوط به سرویس cron خواهیم دید که با فرا رسیدن بازه زمانی 60 ثانیه، جاب مجددا اجرا خواهد شد:
[root@avazi ~]# tail -f /var/log/cron
Nov 2 15:52:01 jabbarsink CROND[21417]: (root) CMD (/root/myscript)
Nov 2 15:53:01 jabbarsink CROND[21511]: (root) CMD (/root/myscript)
Nov 2 15:54:01 jabbarsink CROND[21609]: (root) CMD (/root/myscript)
[root@avazi ~]# ls -l /home/oracle/myfile_*
-rw-r–r– 1 root root 0 Nov 2 15:52 /home/oracle/myfile_155201
-rw-r–r– 1 root root 0 Nov 2 15:53 /home/oracle/myfile_155301
-rw-r–r– 1 root root 0 Nov 2 15:54 /home/oracle/myfile_155401
همچنین با جستجویی در میان پروسسها، خواهیم دید که دو پروسس به طور همزمان در حال اجرای دستور sleep 80 هستند:
[root@avazi ~]# ps -eaf|grep “sleep 80″|grep -v grep
root 21612 21609 0 15:54 ? 00:00:00 sleep 80
root 21715 21709 0 15:55 ? 00:00:00 sleep 80
در صورتی که قصد ممانعت از همپوشانی اجرای این جاب را داشته باشیم، می توانیم از ابزار flock استفاده کنیم این ابزار به صورت پیش فرض در اوراکل لینوکس نسخه 6 و 7 موجود است و با ایجاد یک فایل برای جاب مورد نظر، سبب lock شدن جاب و نهایتا مانع از اجرای مجدد و همزمان آن خواهد شد.
[root@avazi ~]# crontab -e
* * * * * /usr/bin/flock -w 1 /var/run/jj.lock /root/myscript
با تنظیم این cronjob و اجرای جاب تنظیم شده، فایل jj.lock در مسیر تعیین شده ایجاد خواهد شد:
[root@avazi ~]# ls -l /var/run/jj.lock
-rw-r–r– 1 root root 0 Nov 2 15:24 /var/run/jj.lock
با این تنظیمات، جاب مورد نظر در هر دقیقه تلاش می کند تا مجددا اجرا شود اما با توجه به استفاده از ابزار flock، امکان اجرا به ان داده نخواهد شد و بعد از مدت زمان تعیین شده برای پارامتر w(در مثال ما 1 ثانیه)، جاب kill خواهد شد:
Nov 2 15:45:01 jabbarsink CROND[20724]: (root) CMD (/usr/bin/flock -w 1 /var/run/jj.lock /root/myscript)
Nov 2 15:46:01 jabbarsink CROND[20822]: (root) CMD (/usr/bin/flock -w 1 /var/run/jj.lock /root/myscript)
Nov 2 15:47:01 jabbarsink CROND[20906]: (root) CMD (/usr/bin/flock -w 1 /var/run/jj.lock /root/myscript)
Nov 2 15:48:01 jabbarsink CROND[20999]: (root) CMD (/usr/bin/flock -w 1 /var/run/jj.lock /root/myscript)
[root@avazi ~]# ls -l /home/oracle/myfile_*
-rw-r–r– 1 root root 0 Nov 2 15:45 /home/oracle/myfile_154501
-rw-r–r– 1 root root 0 Nov 2 15:47 /home/oracle/myfile_154701
همانطور که در متن فوق قابل مشاهده است، جاب myscript چهار بار اجرا شده، اما عملا منجر به ساخت دو فایل شده است و به عبارتی دیگر، صرفا به دو تا از این جابها امکان اجرا داده شده و دو مورد دیگر آن، اصطلاحا kill شده اند.
نکته: برای ممانعت از kill شدن جاب در حال انتظار، باید مقدار تعیین شده برای سوییچ w- را افزایش داد.