اجرای خودکار اسکریپت Python در Linux
۳۰ بهمن ۱۳۹۹
اسکریپتهای زمانبندی شده یک ضرورت مطلق برای اجرای فرایندهایی مانند جمعآوری اطلاعات برای هوش مصنوعی یا انتشار خبرنامههای هفتگی وبلاگ است. بخش قابل توجهی از فرایندهای قابل برنامهریزی در سیستمعامل Linux میزبانی و توسط اسکریپتهای Python اداره میشوند. در این مقاله قصد داریم تا با استفاده از Cron در Linux یک اسکریپت Python را با زمانبندی مشخصی اجرا و خروجی آن را در یک فایل ذخیره کنیم.
دستورات این مقاله مختص توزیعهای Fedora بهویژه CentOS است. بااینحال فرایند نصب Cron در اکثر توزیعهای محبوب یکسان است بنابراین بدون نگرانی میتوانید به مطالعهی ادامهی مقاله بپردازید.
نصب Cron
به احتمال زیاد Cron از قبل بر روی سیستمعامل Linux شما نصب شده است. برای مشاهده فرایندهای ثبت شده در Cron میتوانید Terminal را باز کرده و دستور زیر را اجرا کنید:
crontab -l
اگر چیزی در خروجی نمایش داده نمیشود، نگران نباشید. همچنین اگر Cron را بر روی سیستمعامل خود نصب ندارید میتوانید با استفاده از دستورهای زیر، به نسبت توزیعی که از آن استفاده میکنید این ابزار را نصب کنید:
اجرای Crond در Boot سیستمعامل | فعال کردن اجرای Crond در Boot سیستمعامل | دستور نصب ابزار Cron | توزیع Linux |
---|---|---|---|
chkconfig crond on | systemctl enable crond | yum install vixie-cron | CentOS 6 |
chkconfig crond on | systemctl enable crond | yum install cronie | +CentOS 7 |
chkconfig crond on | systemctl enable crond | dnf install cronie cronie-anacron | +Fedora 22 |
update-rc.d cron defaults | systemctl enable crond | sudo apt-get install cron | Debian |
پیادهسازی اسکریپت Python
برای پیادهسازی اسکریپت Python یک پوشه بهدلخواه خود ایجاد کنید. سپس فایلی با نام datetimer.py
ایجاد کرده و کدهای زیر را در آن قرار دهید:
from datetime import datetime
print(datetime.now())
این اسکریپت زمان را به ما نمایش میدهد و مسیری که ما برای آن انتخاب کردهایم /home/test
است. همچنین مطمئن شوید که Python را بر روی سیستم خود نصب کرده باشید یا میتوانید با مطالعهی مقالهی آموزش نصب Python، مفسر این زبان برنامهنویسی را بر روی سیستمعامل خود نصب کنید.
در حالت ایدهآل بایستی یک Environment برای توسعهی پژوههای Python پیکربندی کنید. بههمین منظور با مطالعهی مقالهی آموزش نصب و استفاده از Virtual environment در Python اطلاعات بیشتری در این زمینه کسب خواهید کرد.
در هر صورت اگر از یک Environment استفاده میکنید مطمئن شوید که آن را active کرده باشید در غیر این صورت فقط Terminal را باز کرده و دستور زیر را اجرا کنید:
which python
# or 'which python3'
دستور فوق مسیر نصب مفسر Python را به ما نشان میدهد که در مرحلهی بعد، از آن برای اجرای اسکریپت استفاده خواهیم کرد.
زمانبندی اسکریپت با استفاده از Cron در Linux
زمانبندی اسکریپت با استفاده از Cron در Linux میتواند کمی گیج کننده بهنظر برسد اما سعی میکنیم با توضیحات بیشتر مفاهیم پایهای مورد نیاز را به شما آموزش دهیم تا درک کاملی از این فرایند پیدا کنید. در قدم اول Terminal سیستمعامل خود را باز کرده و دستور زیر را اجرا کنید:
crontab -e
با اجرای دستور فوق، فایلی باز میشود که میتوانید فرایندهای مورد نیاز خود را در هر خط از آن فایل، زمانبندی و برنامهریزی کنید. در حال حاضر احتمال خالی بودن این فایل بسیار زیاد است و شاید یک سری محتوای کامنت شده را مشاهده کنید چون هنوز هیچ فرایندی زمانبندی شدهای در Cron ثبت نشده است.
اگر برای اولین بار است که دستور فوق را اجرا میکنید از شما خواسته میشود تا یکی از ویرایشگرهای متنی موجود در سیستمعامل را بهصورت پیشفرض برای ایجاد تغییرها انتخاب کنید که ما در این آموزش از Vim استفاده خواهیم کرد.
اگر شما هم Vim را بهعنوان ویرایشگر پیشفرض انتخاب کرده باشید بایستی حرف i
را از روی کیبورد فشار داده تا وضعیت ویرایشگر به حالت insert تغییر کند و قادر باشید فرایند خودکار مورد نیاز خود را بهصورت زیر تعریف کنید:
*/5 * * * * /usr/bin/python3 /home/test/datetimer.py >> /home/test/cron.log 2>&1
برای ذخیره فایل نیز بایستی ESC
را از روی کیبورد فشار داده و :wq!
را تایپ کنید و سپس کلید Enter را فشار دهید تا تغییرها در آن فایل اعمال شوند. همچنین در ادامه توضیح خواهیم داد که هر بخش از کدهای بالا چه عملکردی دارند.
بخش اول یعنی */5 * * * *
، پنج واحد زمانی است که میتوانیم آنها را نسبت به نیاز خودمان تنظیم کنیم:
<minutes> <hours> <day-of-month> <month> <day-of-week>
Symbolهایی که میتوانیم در این الگوی زمانی استفاده کنیم به شرح زیر هستند:
*
: این Symbol را میتوان بهمعنای every دانست. برای مثال اگر از این Symbol در واحد زمانی minutes استفاده کنید یعنی هر دقیقه.,
: این Symbol را میتوان یک separator دانست. برای مشخص کردن چندین مقدار بهطور همزمان از,
استفاده خواهیم کرد. برای مثال اگر بخواهیم یک فرایند در روز اول ژانویه و یک بار دیگر در اول مارس اجرا شود میتوان الگوی زمانی را اینگونه0 12 1 1,3 *
تعریف کرد.-
: این Symbol را میتوان برای تعریف یک محدودهی زمانی استفاده کرد. مثلا اگر بخواهیم فرایندی در بازهی زمانی ظهر دوشنبه تا جمعه هر ماه اجرا شود بایستی الگوی زمانی را بهصورت0 12 * * 1-5
تعریف کرد./
: برای تعریف فرایندهای تکرار شونده و مرحلهای میتوان از این Symbol استفاده کرد. برای مثال اگر بخواهیم فرایند ما هر پنج دقیقه اجرا شود از الگوی*/5 * * * *
استفاده خواهیم کرد.
ممکن است بهخاطر سپردن همهی این نکتهها بسیار دشوار باشد بههمین دلیل توصیه میشود از سایت crontab guru استفاده کنید.
بخش دوم یعنی /usr/bin/python3 /home/test/datetimer.py
دستوری است که برای اجرای اسکریپت استفاده خواهیم کرد.
بخش سوم یعنی <scheduler> <command> >> /home/test/cron.log 2>&1
به ما کمک میکند تا خروجی اسکریپت را در فایل cron.log
ذخیره کنیم. قسمت چالش برانگیز این بخش را میتوان 2>&1
دانست که 2
خطاهای دریافت شده برنامه است و به &1
یعنی فایل cron.log
ریدایرکت میشود.
پیکربندی و راهاندازی Cron
Systemctl یک سرویس Linux است که تمام فرایندهای درحال اجرا در پسزمینهی سیستمعامل را کنترل میکند. حال ما در نظر داریم تا Cron را بهعنوان یک فرایند، در پسزمینهی سیستمعامل اجرا کنیم. اولین چیزی که باید بررسی کنیم این است که آیا پروسهی Cron در حال اجرا است یا خیر؟ بنابراین Terminal سیستمعامل خود را باز کرده و دستور زیر را اجرا کنید:
systemctl status crond
اگر در خروجی دستور بالا حالت Active یا همان Runnig را مشاهده کردید یعنی فرایند Cron در حال اجرا است. بااینحال، برای شروع فرایند خودکار اجرای اسکریپت Python بایستی Cron را مجددا راهاندازی کرده یا در صورت غیرفعال بودن، آن را فعال کنیم. برای راهاندازی مجدد میتوانید دستور زیر را اجرا کنید:
sudo systemctl restart crond
و برای فعال کردن این فرایند میتوانید restart
را با start
جایگزین کرده و دستور را اجرا کنید. با اجرای دستور فوق، وضعیت فرایند Cron مجددا در Console برای شما چاپ میشود.
حال با اجرای مجدد سرویس crond
، خروجی اسکریپت datetimer.py
در فایل cron.log
در مسیر /home/test
ذخیره میشود که میتوانید با اجرای دستور زیر خروجیهای ثبت شده را مشاهده کنید:
cat /home/test/cron.log
جمعبندی
امیدواریم این مقاله در برنامهریزی و خودکارسازی فرایندهای مورد نیاز شما در سیستمعامل Linux به کمک Cron مفید بوده باشد. همچنین میتوانید از این آموزش برای تعریف طیف گستردهای از فرایندها در پسزمینهی سیستمعامل استفاده کنید.
منبع: https://medium.com/better-programming/scheduling-python-scripts-on-linux-fa0d28a8f915
توسعهدهندگان دربارهی ما چه میگویند
تجربه کار باliara_cloud@امروز خیلی خوب بود. یکی از سرویس هام رو منتقل کردم روش و راضیم. انقد سریع و جذاب کارم راه افتادم اصن باورم نمیشد! برعکس سرویس های PaaS دیگه با اون همه پیچیدگیشون. دمتون گرم
...
MohammadReza
keikaavousi
بعد از بسته شدن @fandoghpaas و ناراحتی همهمون از اینکه یه سرویس خوب و صادق نمیتونه از پس هزینهها بر بیاد، سرویسم رو منتقل کردم به پاس لیارا (https://liara.ir @liara_cloud) . تجربه راحت و خوب. تفاوتهایی داشت که کمی کار میخواست ولی تا الان کاملا راضی.
jadi
jadi
یه خسته نباشید باید به تصمیمliara_cloud@بگم،
بعد از چندین روز سرکله زدن با سرویس های مشابه بالاخره تصمیم گرفتم لیارا رو امتحان کنم و باور نمیشه ۱۰ دقیقه بیشتر وقت نبرد،
دمتون گرم.
Arch
EbadiDev
واسه سرویس PaaS با اختلاف لیارا بهترین رابط کاربری داره و یکی از مزیتهای سرویس دیتابیسشون اینه که خودشون به صورت دورهای بکآپ میگیرن.
...
Ali Najafi
me_ali_najafi
یکی از کارهای خوبی که جدیداً میکنم اینه که یه دیتابیس روی لیارا میسازم و به پروژه وصل میکنم اینطوری هم خونه و هم محل کار دیتابیس بروز رو دارم و راحت میتونم ادامه بدم کار روliara_cloud@
Navid
1navid
عاشقliara_cloud@شدم درسته در حد AWS نیست ولی خب تجربه خوبی واسه پروژه های داخل ایران ارائه میده، میتونم رو CD هم اجراش کنم
Amir H Shekari
vanenshi