بایگانی دسته: شل

پیدا کردن اسکریپت های cpu بر php

امروز یه مشکل برخوردم. وب سایت به روزرسانی شده بود و یکی از اسکریپت های به روز رسانی شده دردسر درست کرده بود. هر از گاهی php میزان مصرف cpu اش میرسید به ۱۰۰ درصد، ولی نمی دونستیم کدوم اسکریپته. لازم بود که سیستم را یه مدت کوتاه بزارم زیر مانیتور تا هر موقع درخواستی بیش از ۵۰ درصد cpu را مصرف کرد، لاگ بگیره.

برای همین نیاز به ابزاری برای لاگ کردن درخواست های php و میزان مصرف cpu شون داشتیم. شاید بپرسید خوب یه top باز کن ببین!

یکی اینکه هر از گاهی این اتفاق می افتاد و تا می اومد برم بررسی کنم مصرف cpu عادی می شد و نمی تونستم بفهمم مشکل کجاست.

سوال: به چه شکل درخواست های cpu بر php یک وب سایت را پیدا کنم؟

جواب: نیاز به ابزاری آماده نیست، با استفاده از ابزارهای موجود bash و چند تا دستور کنار هم می تونید به شکل زیر به نتیجه مورد نظرتون برسید:

while true; do ps faxuewwww -we | grep php | grep –color “^www-data” | tr -s ‘ ‘ | cut -f 1,3,10- -d ” “| while read user cpu proc; do if [ “${cpu%.*}” -ge “50” ]; then echo “$cpu $proc” >> /tmp/php.log; fi ;  done; sleep 2 ; done

بزارید این دستور یه مدت کار کنه و بعد فایل tmp/php.log/ را بررسی کنید. دقت کنید که فرض بر این شده که وب سرور شما داره با کاربر www-data اجرا شده است.

معرفی Oakvnc

بعد از مدتها بالاخر وقت کردم آمادش کردم. خیلی وقت بود که احساس می کردم نیاز به یک سرویس remote desktop دارم. مشکلم با سرویس vnc موجود سخت بودن استفاده ازشون بود. بالاخره یک package آماده کردم که استفاده از vncserver را ساده می کند. یک فایل کانفیگ و یک سری اسکریپت که می تونه موقع بالا آمدن سیستم اجازه دسترسی بهم بده.

توضیحات بیشتر را می تونید از اینجا مطالعه کنید. و بسته قابل نصب برروی دبیان و اوبونتو را هم می توانید از اینجا دریافت کنید.

ادغام history چندین ترمینال

خیلی از ما در هنگام کار با سیستم ویا سرور چندین ترمینال باز می کنیم تا چند کار را همزمان جلو ببریم و یا چندین موضوع و یا log فایل را زیر نظر بگیریم. اتفاقی که همیشه بروز می کند، پس از اتمام کار و بستن ترمینال ها تاریخچه خط فرمان آخرین ترمینال را در اختیار خواهیم داشت و بقیه تاریخچه ها توسط تاریخچه آخرین ترمینال بازنویسی می شوند.

برای جلوگیری از این کار کافیست متغیر محیطی PROMPT_COMMAND را به صورت زیر در فایل etc/bash.bashrc/ تعریف کنید

export PROMPT_COMMAND=’history -a’

کافیست ترمینال را ببندید و مجدد باز نمایید. از این پس هر دستوری که وارد می کنید، بلافاصله به history اضافه می گردد.

منبع: سیوک

استخراج لینک های دانلود

دیروز با یک مشکل مواجه شدم. می خواستم تمام فونت های font.ir را که در حدود ۵۰ فونت هست را دریافت کنم. تنبلی من اجازه نمی داد روی تمام لینک کلیک کنم. تصمیم گرفتم تا لینک های درون صفحه را استخراج کنم و بعد همه را به صورت دسته ای دانلود کنم. خوب اولین و تنها چیزی که به ذهنم رسید استفاده از sed بود. بعد از کلی کلنجار رفتن نتیجه زیرحاصل شد.

اول صفحه سایت font.ir را ذخیره کردم و با خط زیر به نتیجه دلخواه رسیدم:

sed -n ‘s/.*\(http.*ttf\).*/\1/p’ font.html | xargs wget

مهمترین نکته توی این خط دستور، استفاده از «.» و «*» در regex بود. من همیشه استفاده از این دو را در wildcard و regex اشتباه می گرفتم. ولی با این نمونه کلا موضوع برام شفاف شد. در regex «.» به عنوان character set و «*» به عنوان modifire است (فرض را براین گرفتم که شما از سه ماده اولیه یک regex یهنی character set، modifire و anchors آگاهی دارید. در صورتی که به گوشتون نخورده به اینجا مراجعه کنید.). برای همین شما نمی تونید از «*» به تنهایی استفاده کنید و همان نتیجه مشابه در wildcard را بگیرید. حتما باید به همراه یک character set ازش استفاده کنید.

در مورد بقیه قسمت ها هم در صورتی که با sed آشنایی داشته باشید، مشکلی در فهم دستور نخواهید داشت. اگه ندارید به اینجا مراجعه کنید.

تبدیل جمعی فایل های چند رسانه ای

یه مشکلی که همیشه داشتم این بود که کلی فایل تصویری بود که از یوتیوب و این ور اونور می گرفتم. وقتی می خواستم این ها را به mp3 تبدیل کنم تا بتونم توی ماشین هم گوش بدم ، کلی زمان از دست می دادم . باید می شستم دونه دونه تبدیل می کردم و منتظر تمام شدن هر کدوم می شدم.

پس تصمیم گرفتم یه راه حل پیدا کنم که با یه اسکریپت همه را خودش تغییر بده. اونقدر ها هم سخت نبود ، فهمیدم فقط تنبلی باعث می شده که من این کار را انجام ندم. 🙂

این هم اسکریپت نهایی شده:

OIFS=$IFS
IFS=$(echo -en “\n\b”)

for i in `ls *.mp4` ;
do ffmpeg -i “$i” “${i%.*}”.mp3 ;
done

IFS=$OIFS

خوب توی همین چند خط چندین نکته نهفته است. یا بهتر بگم چندین مورد آموزشی:

اول از همه متغیر محیطی IFS یا Internal Field Separator : این متغیر مشخص می کنه که جدا کننده بین ورودی های یک نرم افزار را چی مشخص می کنه . به صورت پیشفرض فاصله هست. ولی در اینجا ما اون را تغییر دادیم تا با خروجی ls هماهنگی داشته باشه. فقط نکته ای که نمی دونم اینه که به چه شکل می شه فهمید که خروجی یک دستور از چه کاراکترهایی برای جداسازی خروجیهاش استفاده می کنه. متغیر OIFS هم برای این مشخص شده که آخر اسکریپت بتونیم مقدار پیشفرض متغیر IFS را بهش برگردونیم.

یه بخش دیگه داخل دستور ffmpeg هم هست که از variable mangling استفاده کردم: ${i%.*} این دستور از آخر تا نقطه اول که در حقیقت پسوند فایل هست را حذف می کند و بعد به جای آن mp3 را قرار دادم.

همین … به همین سادگی