اجرای خودکار وظایف در لینوکس — به زبان ساده
در این راهنما با شیوه بهرهگیری از «رویدادهای فایل سیستم لینوکس» (Linux filesystem events) آشنا خواهید شد تا به کمک آن از اضافه شدن هر فایل جدید به یک دایرکتوری معین مطلع شوید. البته به کمک این راهکار، قادر خواهید بود تعریف کنید که بسیاری از وظایف رایج سیستمی به شکل خودکار اجرا و انجام شوند. به زبان سادهتر در ادامه به دنبال اجرای خودکار وظایف در لینوکس خواهیم بود.
در ادامه بنا داریم اسکریپتی بنویسیم که یک دایرکتوری را زیر نظر میگیرد و روی فایلهایی که اضافه میشوند عملیاتی اجرا میکند. این عملیات شامل فشردهسازی gzip هر فایل و انتقال آن به یک دایرکتوری دیگر است و این کار به محض شناسایی فایل جدیداً اضافه شده صورت میگیرد.
این اسکریپت به کمک ابزاری با عنوان inotify-tools از ساب-سیستم inotify استفاده میکند. اما قبل از توضیح این مواد ابتدا باید این ابزار را نصب کرده و سپس مورد استفاده قرار دهیم.
نصب inotify-tools و gzip
در صورتی که از اوبونتو یا دیگر توزیعهای مبتنی بر دبیان استفاده میکنید، میتوانید با استفاده از apt-get این پکیج را روی سیستم خود نصب کنید؛ اما اگر از توزیعهای دیگر لینوکس استفاده میکنید، باید از ابزار مدیریت پکیج مخصوص آن استفاده کنید:
sudo apt-get install inotify-tools gzip
آزمایش کردن inotify-tools
کار خود را با تماشای یک دایرکتوری و دیدن این که چه رویدادهایی در زمان اضافه شدن یک فایل رخ میدهند آغاز میکنیم. ما از ابزاری به نام inotifywatch استفاده خواهیم کرد که بخشی از inotify-tools است. یک دایرکتوری جدید به نام incoming بسازید:
mkdir incoming
با اجرا کردن دستور زیر شروع به نظارت بر این دایرکتوری بکنید:
inotifywatch -v incoming
بدین ترتیب به inotify اطلاع میدهید که رویدادهای فایل سیستم را در دایرکتوری incoming تحت نظر بگیرد. گزینه v- موجب میشود که این ابزار اطلاعاتی را در مورد کارهایی که انجام میدهد پرینت کند. ما هیچ گزینه timeout با استفاده از فلگ t- تعریف نکردهایم و دستور تا زمانی که با استفاده از کلیدهای CTRL+C از آن خارج نشویم به گردآوری دادهها ادامه میدهد. در این مرحله، ترمینال ما باید مانند تصویر زیر باشد:
یک پنجره (یا برگه) ترمینال جدید باز کنید و تغییری در دایرکتوری incoming ایجاد کنید. از دستور touch برای ایجاد فایل جدیدی به نام newfile استفاده کنید:
cd incoming/ touch newfile
اینک به پنجره ترمینال اول بازگردید و inotifywatch را با زدن کلیدهای CTRL+C متوقف کنید:
همان طور که میبینید جدولی از رویدادها در کنسول ارائه شده است که نشانگر یک وهله از رویدادهای create ،open ،attrib و close_write است. این چهار رویداد زمانی رخ دادهاند که از touch برای ایجاد یک فایل جدید استفاده کردهایم. در ادامه خصوصیت دسترسی به فایل تعیین شده، فایل برای نوشتن کاراکتر null terminating باز شده و سپس فایل بسته شده است. اینها تنها موارد معدودی از خیل رویدادهایی هستند که میتوان با استفاده از inotify-tools روی فایل سیستم مورد نظارت قرار دارد. با مراجعه به صفحه راهنمای inotify-tools میتوانید فهرست کامل این رویدادها را ببینید.
محدودسازی موارد نظارتی
با توجه به مقاصدی که در این مقاله پیگیری میکنیم، صرفاً دو مورد از این رویدادها مورد علاقه ما هستند:
- create – زمانی است که یک فایل در دایرکتوری مقصد ایجاد میشود.
- moved_to – زمانی است که فایلی از یک مکان به دایرکتوری مقصد انتقال مییابد.
در ادامه یک بار دیگر inotifywatch را امتحان میکنیم؛ اما این بار آن را طوری تنظیم میکنیم که صرفاً این رویدادها را مورد نظارت قرار دهد. دستور زیر را در پنجره ترمینال اول خود وارد کنید:
inotifywatch -v -e create -e moved_to incoming
در پنجره یا برگه ترمینال دوم یک فایل جدید ایجاد کنید، محتوای آن را تغییر دهید و سپس آن را از مکان دیگری به دایرکتوری مقصد انتقال دهید. همه این دستورها از دایرکتوری home اجرا میشوند:
touch incoming/created echo Testing123 >> incoming/created touch /tmp/created2 mv /tmp/created2 incoming/
اینک به پنجره یا برگه ترمینال نخست بازگردید و با زدن کلیدهای CTRL+C ابزار inotifywatch را متوقف کنید. خروجی زیر مشاهده میشود:
چنان که میبینید تنها دو رویداد شمارش شدهاند. یکی از این رویدادها مربوط به ایجاد کردن فایلی به نام created.txt و رویداد دیگر انتقال یافتن یک فایل موجود به نام created2.txt است. هر چیز دیگر مانند اصلاح کردن created.txt نادیده گرفته شده است.
نظارت روی یک دایرکتوری و اجرای یک وظیفه
اکنون که میدانیم رویدادها را چگونه پیگیری کنیم، میتوانیم از ابزار دیگری به نام inotifywait برای مسدودسازی اجرای یک وظیفه تا زمان ایجاد شدن یا انتقال یافتن فایلی به دایرکتوری مقصد استفاده کنیم. در این دستور از همان آرگومانهای مربوط به دستور inotifywatch استفاده میکنیم و ضمناً تعیین میکنیم که نام فایل برای استفاده در وظیفه ما باید چگونه قالببندی شده باشد.
پیش از آغاز این کار باید یک دایرکتوری برای نگهداری فایلهایی که قبلاً پردازش شدهاند بسازیم. به این منظور یک دایرکتوری به نام processed ایجاد میکنیم:
mkdir processed
سپس یک اسکریپت جدید به نام watch-incoming.sh مینویسیم و محتوای زیر را به آن اضافه میکنیم:
#!/bin/bash TARGET=~/incoming/ PROCESSED=~/processed/ inotifywait -m -e create -e moved_to --format "%f" $TARGET \ | while read FILENAME do echo Detected $FILENAME، moving and zipping mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME" gzip "$PROCESSED/$FILENAME" done
این اسکریپت دستور inotifywait را با گزینه m- اجرا میکند. این دستور موجب میشود، دستور مورد نظر تغییرات را به صورت نامحدود مورد نظارت قرار دهد. هر بار که رویداد جدیدی شناسایی شود، نام فایل به دستور read ارسال میشود و در متغیر FILENAME تزریق میشود. در ادامه بلوک زیر حلقه while اجرا میشود که در آن ابتدا فایل به دایرکتوری انتقال مییابد و سپس با الگوریتم gzip فشرده میشود. فایل اصلی با فایل فشرده تعویض و به انتهای نام فایل، عبارت «gz.» افزوده میشود.
در این مرحله به این اسکریپت دسترسیهای اجرایی میدهیم و آن را از دایرکتوری home اجرا میکنیم:
chmod u+x watch-incoming.sh ./watch-incoming.sh
پنجره ترمینال دوم را باز کنید و یک فال جدید در دایرکتوری incoming ایجاد کنید. محتوای هر دو دایرکتوری incoming و processed را ببینید تا نتایج شناسایی رویدادها را ملاحظه کنید:
فایل متنی جدید که در دایرکتوری incoming کپی شده است از سوی اسکریپت شناسایی و به دایرکتوری processed کپی میشود و سپس با استفاده از gzip فشردهسازی صورت میگیرد.
سخن پایانی در مورد اجرای خودکار وظایف در لینوکس
اینک که میتوانیم ایجاد شدن فایلهای جدید را در یک دایرکتوری تشخیص دهیم، میتوانیم کارهای جالبی را انجام دهیم. برای نمونه میتوانیم به همه فایلهای تصویر آپلود شده یک واترمارک اضافه کنیم، ویدئوهای خام اضافه شده را به قالب mp4 تبدیل کنیم و حتی هر فایل جدیدی را که در دایرکتوری مربوطه میبینیم به فضای ذخیرهسازی آمازون آپلود کنیم. این اسکریپت یک نقطه آغاز خوب برای طراحی گردش کاری شما محسوب میشود و با استفاده از آن میتوانید کارهای روزمره خود را روی سیستم به صورت خودکار اجرا کنید.
اگر این مطلب برای شما مفید بوده است، آموزشهای زیر نیز به شما پیشنهاد میشوند:
- مجموعه آموزش مهارتهای کاربردی کامپیوتر (ICDL)
- گنجینه آموزش های لینوکس (Linux)
- مجموعه آموزش لینوکس (Linux)
- بهترین توزیعهای لینوکس در سال 2۰1۸
- ترمینال لینوکس و آنچه برای شروع به کار با آن باید بدانید
==