بایگانی دسته: اسکریپت

پیدا کردن اسکریپت های 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 اجرا شده است.

اسکریپت jointodomain

پیرو پست «دیدن share ویندوز تحت دامنه» توی شرکت نیاز شد که تمام سیستم های لینوکسی عضو دامنه بشند. من چون اصلا نمی تونستم به این فکر کنم که پای ۴ ۵ تا سیستم بشینم و یه روند هی تکرار کنم ، اون را تبدیل به اسکریپت کردم. خیلی کامل نیست ولی از بازخورد ها استقبال می شه. ادامه خواندن اسکریپت jointodomain

راه اندازی مجدد سرویسها بعد از بروزرسانی

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

مدتی بود با بسته ای به نام debian-goodies آشنا شده بودم که مجموعه ای از دستورات کاربردی بود. یکی از این دستورات checkrestart هست که سرویس‌هایی که باید restart شوند و بسته‌هایی که سرویسی از آنها استفاده نمی کند که restart سرویس مشکل را حل کند را لیست می کند.

این دستور تنها گزارش می‌دهد و خود اقدام به راه اندازی مجدد سرویس ها و سیستم نمی کند. برای این منظور (یعنی راه اندازی خودکار سرویس‌ها) در نسخه جدید بسته اسکریپتی به نام restart-services معرفی شده است که هنوز با مشکل اجرا می گردد و عملا کار نمی کند.

من اومدم این اسکریپت را برای خودم اصلاح کردم ادامه خواندن راه اندازی مجدد سرویسها بعد از بروزرسانی

نوشتن یک init script برای iptables

توی دبیان بر خلاف توزیع های مبتنی بر ردهت هیچ اسکریپتی در init برای مدیریت فایروال نوشته نشده است. شاید بگید این یه مشکل هست یا یه کمبود، ولی دلیلی که می یارند (و البته من هم قبول دارم) اینه که ایجاد اسکریپت init به شکلی که در توزیع های مختلف هست، باعث می شه که شما نتونید از امکانات واقعی یک اسکریپت استفاده کنید. البته به خاطر اینکه همه از دستور iptables-save برای ذخیره استفاده می کنند و این موضوع امکان اضافه کردن شرط یا هر دستور دیگه را در اسکریپت فایروال غیر ممکن می کنه.

من تصمیم گرفتم نحوه نوشتن اسکریپت init برای فایروال با توجه به استاندارد LSBinit و همچنین در نظر گفتن ساختار dependency base جدید در سرویس ها اینجا بیارم.

ادامه خواندن نوشتن یک init script برای iptables

مشکل beep یا همان بوق خودمون ;)

داستان از این قراره که مدتیه این قضیه بوق سیستم که گهگاهی هست و گهگاهی نیست، داشت کفره من را در می آورد. بعد از کلی سرو کله زدن یه جمع بندی براش کردم و به نتایج بس درخشانی رسیدم. (نکته اینکه من دارم از دبیان testing و gnome نسخه ۳٫۰ استفاده می کنم و هیچ مسؤولیتی را در قبال نسخه های دیگه gnome به عهده نمی گیرم 😉 )

قدیم تر از این ها زمانی که دو تا tab می زدی، یا از گزینه a- در دستور ping استفاده می‌کردی، سیستم یه بوقی می زد ولی جدیداً خبری ازش نیست (البته ته کار می گم کجا پیداش کنید) .چیزی که متوجه شدم ساختار کارش به این شکل شده:

اول اینکه این بوق زمانی وجود می تونه داشته باشه که شما در کنسول باشی (tty1 تا …) و نه توی xterm یا یک ssh session.
دوم اینکه همین هم زمانی کار می ده که در کرنل CONFIG_INPUT_PCSPKR=m کانفیگ شده باشه و علاوه بر اون ماژول pcspkr هم لود شده باشه

modprobe pcspkr

سوم اینکه اگه دوست دارید توی اسکریپتتون یه بوقی بزارید و خوب با این شرایط نمی شه و یا مورد چهارم را می خواهید کاری باهاش نداشته باشید، بسته beep را نصب کنید.
و اما چهارم اینکه این بوق خودمون را در محیط گرافیکی هم فعال کنید، که البته دیگه بوق سیستم نیست و از بلندگو های سیستم صداش را می شنوید. باید dconf-editor را اجرا کنید و به شکل زیر عمل کنید

org -> gnome -> desktop -> sound -> event-sound

خوب sound-event را تیک بزنید و از صدای مزخرف حاصله استفاده کنید 😉
این مورد آخر را از انجمن arch پیدا کردم. واقعا تیم arch تیم قویی شده.

 

slideshow در بگ گراند

خیلی کار عجیب غریبی نمی خوام بکنم. چهار تا عکس باحال گیر آوردم تصمیم گرفتم به صورت تصادفی بک گراندم را عوض کنم. کار ساده ایه مخصوصا اگه جستجو کنی همین کار ساده را هم آماده اش را استفاده کنی 😉

#!/bin/bash

# Script to randomly set Background from files in a directory

# Directory Containing Pictures
DIR=”/home/behrad/Pictures/background”

# Command to Select a random jpg file from directory
# Delete the *.jpg to select any file but it may return a folder
PIC=$(ls $DIR/*.jpg | shuf -n1)

# script find wich session must run next command
if [[ -z “$DBUS_SESSION_BUS_ADDRESS” ]]; then source “$HOME/.dbus/session-bus”/*-0 && export DBUS_SESSION_BUS_ADDRESS; fi

# Command to set Background Image
gconftool -t string -s /desktop/gnome/background/picture_filename $PIC

(یه اصلاح کوچیک در اسکریپت انجام دادم)
خوب این اسکریپت را در bin/~ ساختم و بعد گذاشتم توی crontab کاربر .یعنی با crontab -e این کار را کردم

*/۳ * * * * /home/behrad/bin/background-shuffle.sh

عکس هایی که در موردش حرف می زدم را از اینجا و استریپت را از اینجا گرفتم.

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

دیروز با یک مشکل مواجه شدم. می خواستم تمام فونت های 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 آشنایی داشته باشید، مشکلی در فهم دستور نخواهید داشت. اگه ندارید به اینجا مراجعه کنید.