جلوگیری از همپوشانی اجرای جاب در لینوکس

در صورتی که زمان درنظر گرفته شده برای اجرای یک جاب کافی نباشد(در محیط 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- را افزایش داد.

 

ارتباط با نویسنده مطلب:vahidusefzadeh@ کانال تخصصی اوراکل و لینوکس: OracleDB@

پاسخی بگذارید

نشانی ایمیل شما منتشر نخواهد شد.