
Thursday, February 02, 2006
حذف فایلهای قدیمی در یونیکس!
خوب امروز بریم یه کمی یونیکس بازی کنیم...
یونیکس کارا میدونن که ابزار Perl یکی از مهم ترین ابزارهای مدیریتی و برنامه نویسی در یونیکسه!!
بعضیا ممکنه بگن چرا مدیریتی!؟!! مگه Perl زبان برنامه نویسی نیست؟.. باید بگم چرا همین طوره ... این یکی از زبانهای اسکریپت نویسی در محیط یونیکسه اما کاربرد زیادی در مدیریت سیستمهای یونیکس داره... همونطور که اگه یه نفر مدیر شبکه میتنی بر ویندوز اگه بلد باشه اسکریپتهای مدیریتی ویندوز رو بنویسه خیلی از کاراش آسون تر میشه...
خوب ممکنه کسی بخواد Perl رو توی محیط ویندوز استفاده کنه، خوب باید بگم این کار هم شدنیه و بسته های برنامه نویسی زیادی تحت ویندوز براش وجود داره... ولی روی ویندوز این ابزار بیشتر جنبه برنامه نویسی پیدا میکنه و از همه مهم تر خیلی از کارهایی که انجامش به محیط عامل بر میگرده غیر فعال میشه به خاطر همیین معمولا سازگاری نرم افزارهای نوشته شده با این زبان بین یونیکس و ویندوز گاهی مشکل میشه... البته غیر ممکن نیست. ولی نرم افزار نوشته شده با این زبان بین دو ماشین یونیکس بدون هیچ مشکلی قابل انتقاله.
بعد از این مقدمه میخوام راجع به یه تابع جالب از Perl بنویسم که کاربردش رو با یک مثال خواهم آورد.
تابع
stat(filename) کارش اینه که وضعیت یک فایل رو به صورت یک آرایه سیزده عنصری بر میگردونه به این جدول نگاه کنید:
0) dev= device number of filesystem
1) ino= inode number
2) mode= file mode (type and permissions)
3) nlink= number of (hard) links to the file
4) uid= numeric user ID of file's owner
5) gid= numeric group ID of file's owner
6) rdev= the device identifier (special files only)
7) size= total size of file, in bytes
8) atime= last access time in seconds since the epoch
9) mtime= last modify time in seconds since the epoch
10) ctime= inode change time in seconds since the epoch
11) blksize= preferred block size for file system I/O
12) blocks= actual number of blocks allocated
خوب برای خوندن این 13 عنصر طبق دستور زبان Perl به این روشها میشه کار کرد:
1) برای خوندن کل آرایه:
@items = stat("/home/userA/test.txt");
2) برای مقدار دهی چندین متغیر به صورت همزمان و بدون استفاده از آرایه:
($dev,$ino,$mode,$nlink,
$uid,$gid,$rdev,$size,
$atime,$mtime,$ctime,
$blksize,$blocks)
= stat("/home/userA/test.txt");
3) برای دسترسی به فقط یک یا چند عنصر به صورت مجزا:
$mode = (stat("/home/userA/test.txt"))[2];
$mtime = (stat("/home/userA/test.txt"))[9];
برای کاری که ما میخواهیم انجام بدیم چیزی که مهمه آخرین تاریخ تغییر فایله. در Perl تاریخ به صورت تعداد ثانیه ها بر حسب مبدا تاریخ Thu Jan 1 03:30:00 1970 سنجیده میشه.. خوب تاریخ هم که به عقب بر نمیگرده...
یه تابع دیگه هم نیاز داریم اونهم تابعیه که زمان جاری رو بهمون بده.. قابل حدثه مگه نه؟... تابع
time() خوب حالا ببینیم چی میتونیم بسازیم:
$filemaxage = 10 * 24 * 3600;
$filename = '/home/userA/test.txt';
$mtime = (stat($filename))[9];
if ( (time() - $mtime) > $filemaxage){
         unlink($filename);
}
تابع
unlink() فایل رو حذف میکنه. و
$filemaxage ماکزیمم طول عمر فایل بر حسب ثانیه هستش که اینجا برای 10 روز محاسبه شده. بنا بر این، برنامه ما اگه فایل قدیمی تر از 10 روز باشه پاکش میکنه.
خوب فکر میکنم این اسکریپت به اندازه کافی واضح باشه.. بریم کاملش کنیم... حالا میخوایم آدرس یه دایرکتوری رو بدیم که بره توش بگرده و فایلهای قدیمی رو پاک کنه برای این کار باید فهرست دایرکتوری رو به دست بیاریم... تابع
glob() این کارو انجام میده.
خوب ببینیم چه تغییری باید روی اسکریپت بدیم:
$dirpath = '/home/userA/';
$filemaxage = 10 * 24 * 3600;
$curtime = time();
@dirlist = glob($dirpath);
foreach (@dirlist){
         $mtime = (stat($_))[9];
         if ( ($curtime - $mtime) > $filemaxage){
                  unlink($_);
         }
}
اگه دوست داشته باشید میتونین برای استفاده های بعدی برنامه ای رو که نوشتین به صورتی در بیارین که با پارامترهای سطر فرمان هم کار کنه مثلاً به این صورت:
#!/usr/local/bin/perl
if ($#ARGV != 1){
         die "usage:rmold \n";
};
$dirpath = $ARGV[0];
$filemaxage = $ARGV[1]* 86400;
$curtime = time();
@dirlist = glob "$dirpath/*";
foreach (@dirlist){
         $mtime = (stat($_))[10];
         if (($curtime - $mtime)> $filemaxage){
                  unlink $_;
         }
}
ممکنه کسی بپرسه که کاربرد این اسکریپت چی میتونه باشه؟... جوابش اینه... اگه شما بخواهید که فایلهای قدیمیSESSION رو که مثلاً توسط PHP ایجاد شده پاک کنین میتونین با استفاده از این اسکریپت و سرویس cron این کار رو هر چند لحظه یک بار انجام بدین...
من خودم این اسکریپت رو برای این نوشتم که ایمیلهائی رو که به عنوان اسپم شناسائی شدن و در دایرکتوری SPAM روی Mail Server قرار گرفتن، در صورتی که مدت معینی از عمرشون گذشته باشه به صورت خودکار پاک بشن.
ضمناً برای اونهائی که میخوان این کد رو تست کنن باید بگم من اونو روی FreeBSD 5.2.1 و Perl v5.8.5 تست کردم...
امیدوارم این مطلب به دردتون خورده باشه...
مرجع:
اين Post را Elvis Moris در زمان
5:27 AM ارسال كرده
نظرات ديگران
-
وب سايت علمی/فنی
©تمامي حقوق اين سايت براي مولف محفوظ مي باشد
Salam pedaram,
kheily bahal bood. arezooye movafaghiat va payandegi
pesare shoma,
S.
Alo, ba ki kar darin shoma? eshteba gerefTn,bale
shomare hamine,.....
مرسی پسرم... قابلی نداشت...
Pedaram pas chera update nemikonid? man har rooz miam sar vazanm , vali hichi update nashode.
Yeki be manam bege inja che khabare?!!!
پسرم درسها دوباره شروع شدن و مجالی نیست... در اولین فرصت باز هم مطلب مینویسم ... خوش باشی پسرم...
Salam e mojadad pedaram,
ajib hal mikonam ba in weblog. lotfan bishtar update konid,
iee Linux ke gofty yani che?
nakone Linux esme khanoome??? haaaaa
pesaretoon