راهنما:اجرای ربات در تولسرور به کمک SGE
این راهنما برای اجرای رباتها بر روی تولسرور بر پایه قوانین جدید تولسرور و استفاده از قابلیت Sun Grid Engine به اختصار SEG است.
اسجیای چیست؟ و چرا؟
[ویرایش]به صورت خلاصه اسجیای روشی است برای اجرای فرمانها (در اینجا کدهای ربات) بر روی سیستم سولاریس یا سیستمهای لینوکس که بر اساس اختصاص منابع کار میکند و از اجرا توسط crontab یا screen پیشرفتهتر و هوشمندتر است.
به بیان ساده اسجیایها فایلهای لفافهای (به انگلیسی: Wrapper) هستند که مشخصات و محدودیتهای کد (ربات) را برای سیستم تعریف میکنند و به ازای هر کدی که اجرا میشود باید یک اسجیای ساخت و به جای اجرای مستقیم کد از اسجیای آن استفاده کرد مثلاً در رایانههای تولسرور در کرونتب به جای مورد یک باید از مورد دوم استفاده کرد
- مورد اول
0 10 0 0 0 python /home/someone/pywikipedia/radeh.py -new:200
- مورد دوم
که روش ساخت فایل Start_Radeh.sh در پائین توضیح داده خواهد شد.
0 10 0 0 0 RadehHamsang /home/someone/pywikipedia/Start_Radeh.sh
- چرا اسجیای ؟
طبق قوانین جدید تولسرور به علت مشکلات منابع در رایانههای تولسرور (سیپییو CPU، حافظه موقت RAM) مجبور به تخصیص بهتر این منابع شدهاند که به کمک اسجیای مقدور است و به شرح زیر است.
شروع به کار
[ویرایش]برای شروع باید یک فایل متنی به پسوند sh. ساخته شود که به Wrapper یا لفافه یا قنداق مشهور است که در آن مشخصات فایل اجرایی (ربات) را باید بنویسید تا سیستم بر اساس مشخصات ذکر شده توسط شما آن کار را انجام دهد. به این معنی که تا زمانی که منابعش برای ربات شما خالی نشده باشد ربات را اجرا نمیکند. (خلاصه کلام: اگر تولسرور شلوغ باشد ممکن از ربات شما تا مدتی اجرا نشود تا حافظهٔ خالی یا سیپییوی خالی دریافت کند)
- مثال
در این مثال
نام کاربری =smith
نام کد رباتی که می خواهیم اجرا کنیم=radeh.py
آرگومان مورد نیاز کد= -new:20
شکل اولیه لفافه به صورت مقابل است:
#!/bin/bash
#
#A wrapper-script for radeh.py.
/home/smith/pywikipedia/radeh.py -new:20
#EOF
ساخت لفافه (Wrapper)
[ویرایش]باید یک فایل متنی با پسوند sh. درست کنید و مشخصات زیر را در آن قرار دهید.
- مدت زمان اجرای کد (مدت زمانی که تصور میکنید تا کد اجرا شود و بر روی سیستم فعال باشد)
- حافظهٔ موقت مورد نیاز (میزان ram یا حافظهٔ موقتی که اجرای کد نیاز دارد)
- معماری کد (برای موارد تخصصی است و برای مشخص کردن اینکه آیا کد با لینوکس کار میکند یا سولاریس که برای کدهای پایویکیپدیا تفاوتی نمیکند در نتیجه همیشه در این آموزش و برای کارهای ویکیپدیا آن را '*' به معنی همه سیستمها، در نظر میگیریم)
- اتصال به دیتابیس اگر کد شما نیاز به کوئری ندارد این متغیر نیاز نیست که تنظیم شود. (اگر کد شما نیاز به کوئری گیری دارد مانند کدهای آماری باید سرور ویکیفا یا ویکی دیگر که میخواهید در مورد آن اطلاعات را کوئری بگیرید را مشخص کنید مثلا برای ویکی انگلیسی s1 است)
- اطلاعرسانی این متغیر برای مطلع کردن شما از انجام کار ربات کاربرد دارد که توضیح داده میشود.
مدت زمان اجرای کد
[ویرایش]برای اجرای کد باید حدس بزنید! که کد چه مدتی کار خواهد کرد که باید به صورت hh:mm:ss (ثانیه:دقیقه:ساعت) بیان شود به مثال زیر توجه کنید
* 00:03:00 → 3 دقیقه
* 01:00:00 → 1 ساعت
* 96:00:00 → 4 روز
* 44:01:00 → 1 روز، 20 ساعت و 1 دقیقه
برای مدت زمان اجرا از متغیر h_rt استفاده کنید که مثلا برای ۲۰ دقیقه به صورت زیر باید در فایل لفافه بنویسیم
# $ -l h_rt=00:20:00
- نکته ۱: زمان مورد نیاز را کمی بیشتر بنویسید مثلا ۵ دقیقه بیشتر تا ربات میان کار توسط سیستم کارش قطع نشود.
- نکته ۲: در روش اسجیای میتوان زمان را نامحدود گرفت ولی به سرعت توسط سیستم تولسرور کار ربات قطع میشود. پس آن را نامحدود تنظیم نکنید!
حافظهٔ موقت مورد نیاز
[ویرایش]مشخص کردن حافظه موقت بر پایه حدس یا اجرای کد با آرگومان مورد است. مثال:
مثلا میخواهیم کد radeh.py را اجرا کنیم این کد با همان آرگومانها و همان عددها باید اجرا کنیم. دقت کنید که تغییر آرگومان یا عددهایش ممکن است حافظهٔ مورد نیاز کد را تغییر دهد پس اگر radeh.py -new:200 شد ۲۰۰ مگ ممکن است radeh.py -recenchanges:30 یک عدد دیگر شود!
برای تخصیص میزان مصرف Ram باید ابتدا برنامه putty (یا برنامهٔ مشابه که کدها را قبلا با آن اجرا میکردید) را باز کنید و کد را اجرا کنید مثلا
python /home/smith/pywikipedia/radeh.py -new:200
بعد یک پوتی دیگر باز کنید و دستور زیر را وارد نمائید.
ps -e -o user,comm,rss|grep smith
نکته مهم: توجه کنید که smith را با نام کاربری تولسرور خود جایگزین کنید. نتیجه جدولی را به شما ارائه میدهد که در آخرین ستون به صورت KB میزان Ram مصرفی مشخص میشود و باید آن عدد را با کمی افزایش مثلا ۵ درصد بیشتر در لفافه بنویسید.
معماری کد
[ویرایش]این گزینه را به صورت
#$ -l arch='*'
رها می کنیم
اتصال به دیتابیس
[ویرایش]- نکته۱:در صورتی که کد شما نیاز به کوئریگیری دارد این بخش را بیافزائید رد غیرآن نیاز به تنظیم آن نیست.
برای ویکیانگلیسی
#$ -l sql-s1-rr=1
برای ویکیفارسی
#$ -l sql-s1-rr=1
را باید در لفافه نوشت
اطلاعرسانی
[ویرایش]در بخش اطلاع رسانی میتوانید تنظیم کنید که سیستم زمان اجرای کد و زمان پایان و درصورتی که کد قطع شد را به شما اطلاع دهد به صورت زیر
-m abe در صورت قطع کار ربات - زمان شروع به کار - زمان اتمام کار
-m ab در صورت قطع کار ربات - زمان شروع به کار
-m ae در صورت قطع کار ربات - زمان اتمام کار
-m a در صورتی که کار ربات قطع شود اطلاع میدهد
که بسته به نیازتان میتوانید هر یک از موارد فوق را تنظیم کنید تا به شما ایمل زده شود و معمولا در مراحل تست مورد اول و در مراحلی که هم چیز مشخص شد نمونه چهارم را تنظیم میکنند.
تنظیم سیاهه
[ویرایش]این بخش برای این آموزش زیاد مهم نیست در نتیجه باید دو خط زیر را به لفافه بیافزائید که خط دوم را بر اساس مشخصات کاربری تولسرورتان خودان تنظیم کنید.
# $ -j y
# $ -o /home/smith/pywikipedia/radeh.log
شکل نهایی لفافه
[ویرایش]بعد از وارد کردن موارد فوق باید لفافه شامل موارد روبرو باشد:
#!/bin/bash
#
# A wrapper-script for radeh.py.
# $ -l h_rt=00:20:00
# $ -l virtual_free=300M
# $ -l arch='*'
# $ -l sql-s1-rr=1
# $ -m abe
# $ -j y
# $ -o /home/smith/pywikipedia/radeh.log
/home/smith/pywikipedia/radeh.py -new:200
# EOF
که در این کد نام کاربر=smith و نام کد radeh.py و زمان اجرا=۲۰ دقیقه و حافظهٔ مورد نیاز ۳۰۰ مگ و از دیتابیس برای کوئری استفاده شدهاست و سیستم در زمان شروع و پایان و در صورت قطع ربات به شما ایمیل میزند و سیاهه را در radeh.log ذخیره میکند.
اجرا
[ویرایش]برای اجرای لفافه میتوانید آن را در crontab بگذارید (برای اطلاعات بیشتر آموزشهای قبلی را مطالعه کنید) و به سیستم اعلام کنید که هر از چه مدتی آن را اجرا کند.
برای اجرای فایل لفافه بیاد دستور زیر را بنویسید:
0 0 0 0 0 bash RadehHamsang /home/smith/pywikipedia/Start_Radeh.sh
- نکته۱:که در اینجا Radeh نامی است که شما برای اجرای این لفافه انتخاب کردهاید که نباید از ۱۰ کاراکتر بیشتر باشد و باید یکتا باشد
- نکته۲:Start_Radeh.sh نام فایل لفافه است.
- نکته۳: smith نام کاربری در تولسرور است که باید با نام کاربری خود جایگزین کنید.
ترفندها
[ویرایش]- ترفند ۱:باید توجه کنید که عدد حافظه و مدت زمان اجرا را درست تعیین کنید اگر عدد کم باشد ربات قطع میشود و اگر زیاد باشد مدت زمانی که کد شما باید منتظر بماند زیاد خواهد بود!
- ترفند ۲: برای هر فرمانی که قبلا در کرونتب مینوشتید باید یک فایل لفافه مانند بالا درست کنید!!
- ترفند ۳:مدت زمان اجرای SGEها را زود به زود نگذارید چون تاثیری ندارد به معنی که اگر یک کد از سوی شما اجرا شود تا آن کد تمام نشود کد بعدی با آن نام همزمان با آن اجرا نمیشود!
اسجیای چند ربات مورد نیاز ویکیفا
[ویرایش]برای راحتی کار و ساخت سریعتر به فایل اسجیای چند نمونه اسجیای کدهای مورد نیاز ویکیفا را در زیر فهرست میکنیم:
ربات ردههمسنگ برای ردهدهی به ردههای جدید
[ویرایش]- کرون تب
- فایل start_radeh1.sh
#!/bin/bash
#
# A wrapper-script for radeh.py.
# $ -l h_rt=00:20:00
# $ -l virtual_free=300M
# $ -l arch='*'
# $ -m a
# $ -j y
# $ -o /home/smith/pywikipedia/radeh1.log
/home/smith/pywikipedia/radeh.py -newcat:30
# EOF
ربات ردههمسنگ برای ۳۰ ردهٔ جدید
[ویرایش]- کرون تب
- فایل start_radeh2.sh
#!/bin/bash
#
# A wrapper-script for radeh.py.
# $ -l h_rt=00:20:00
# $ -l virtual_free=300M
# $ -l arch='*'
# $ -m a
# $ -j y
# $ -o /home/smith/pywikipedia/radeh2.log
/home/smith/pywikipedia/radeh.py -newcat:30
# EOF
ربات ردههمسنگ برای ۱۰۰ مقالهٔ جدید
[ویرایش]- کرون تب
- فایل start_radeh3.sh
#!/bin/bash
#
# A wrapper-script for radeh.py.
# $ -l h_rt=00:20:00
# $ -l virtual_free=300M
# $ -l arch='*'
# $ -m a
# $ -j y
# $ -o /home/smith/pywikipedia/radeh3.log
/home/smith/pywikipedia/radeh.py -new:100
# EOF
ربات میانویکی جدید برای ۱۰۰ مقالهٔ جدید
[ویرایش]- کرون تب
- فایل start_interwiki1.sh
#!/bin/bash
#
# A wrapper-script for new_interwiki.py.
# $ -l h_rt=00:20:00
# $ -l virtual_free=300M
# $ -l arch='*'
# $ -m a
# $ -j y
# $ -o /home/smith/pywikipedia/new_interwiki.log
/home/smith/pywikipedia/new_interwiki.py -new:100
# EOF
ربات میانویکی جدید برای ۱۰۰ ردهٔ جدید
[ویرایش]- کرون تب
- فایل start_interwiki2.sh
#!/bin/bash
#
# A wrapper-script for new_interwiki.py.
# $ -l h_rt=00:20:00
# $ -l virtual_free=300M
# $ -l arch='*'
# $ -m a
# $ -j y
# $ -o /home/smith/pywikipedia/new_interwiki2.log
/home/smith/pywikipedia/new_interwiki.py -newcat:100
# EOF