در دنیای لینوکس همه چیز یا یک فایل است و یا یک پروسه، پس قرار است امروز به معرفی و ساخت، دیدهبانی و کشتن پروسهها در لینوکس پردازیم.
ما برای این که بتونیم سناروی خودمون رو نشون بدیم از یک دستور بامزه و ساده به اسم xeyes استفاده میکنیم که کارش این دوتا چشم موس مارو دنبال کنه :)
xeyes
وقتی شما این دستور را اجرا می کنید تا زمانی که برنامه را نبدید دیگه نمی توانید از ترمینال استفاده کنید.
برای این که بتونید هم این دستور را اجرا کنید و هم ترمینال را داشته باشبد باید بعد دستور مورد نظر یک & قرار دهید، با این کار دستور شما در پشت زمینه یا background اجرا می شود:
xeyes &
که اگر بخواهید ببینید چه دستوراتی در پشت زمینه اجرا می شود از دستور زور استفاده میکنیم:
$ jobs
[1]+ Running xeyes &
همچنین با استفاده از Ctrl+c می توانید یک processes در حال اجرا را ببندید (break / cancel) و یا با استفاده از Ctrl+z آن دستور متوقف کنید و بفرستید پشت زمینه (suspend)
یا با دستور sleep و یه عدد به ثانیه، ترمینال برای آن مقدار زمانی که ما میگیم میره تو حالت sleep مگه با & اجرا کنیم که همین عملیات در پشت زمینه انجام شود:
$ xeyes
^Z
[1]+ Stopped xeyes
$ jobs
[1]+ Stopped xeyes
$ bg
[1]+ xeyes &
$ jobs
[1]+ Running xeyes &
$ sleep 1000 &
[2] 7395
$ jobs
[1]- Running xeyes &
[2]+ Running sleep 1000 &
$ fg %2
sleep 1000
^Z
[2]+ Stopped sleep 1000
$ jobs
[1]- Running xeyes &
[2]+ Stopped sleep 1000
$ bg sle
[2]+ sleep 1000 &
$ jobs
[1]- Running xeyes &
[2]+ Running sleep 1000 &
برای این که دستور اخری که در پشت زمینه هست را اجرا کنیم bg میزنیم و اگر میخواهیم دستور آخر را بیاریم جلوی زمینه یا foreground از fg استفاده می کنیم، البته با دستور jobs هم می توانیم تمام پروسه های background را ببینیم و برای این که با دستور bg و fg موارد دیگر را انتخاب کنیم از % و شماره ترتیب برنامه استفاده می کنیم.
همچنین jobs با سوئیچ l- شماره process ID را نمایش می دهد:
$ jobs -l
همچنین دستور kill نیز برای بستن یک process استفاده می شود:
$ kill %2
آموزش دستور nohup در لینوکس
شما وقتی که process فعال در ترمینال دارید اگر ترمینال را ببندید و یا از سیستم logged out کنید تمام process های شما از بین می رود ولی اگر دستور را با nohup اجرا کنید process های شما حتی بعد از logged out هم اجرا می شود و ادامه پیدا می کند.
$ nohup ping 4.2.2.4
nohup: ignoring input and appending output to ‘nohup.out’
^C$ cat nohup.out
PING 4.2.2.4 (4.2.2.4) 56(84) bytes of data.
64 bytes from 4.2.2.4: icmp_seq=1 ttl=51 time=225 ms
64 bytes from 4.2.2.4: icmp_seq=3 ttl=51 time=223 ms
--- 4.2.2.4 ping statistics ---
4 packets transmitted, 2 received, 50% packet loss, time 3010ms
rtt min/avg/max/mdev = 223.584/224.767/225.950/1.183 ms
یک از کاربرد های این دستور به صورت زیر می باشد:
$ nohup script.sh > mynohup.out 2>&1 &
در این دستور گفتیم یک اسکریپ را اجرا کن و خروجی آن را بریز داخل mynohup.out و ارور ها رو هم بریز همانجا
کشتن یک پروسه با کامند kill در لینوکس
چند قاعده مهم وجود دارد که باید قبل از استفاده فرمان kill بدانیم:
- شما فقط می توانید فرایندهای که متعلق به userid شماست بکشید.
- نمیتوانید فرایندهای کاربران دیگر را بکشید.
- شما نمی توانید پروسه های سیستم را بکشید. مگر اینکه شما کاربر root باشید.
- کاربر root می تواند روی پروسه دیگر کاربران کنترل داشته باشد و همچنین دسترسی کشتن به پروسه های سیستم را نیز دارد.
زمانی که قصد کشتن یک پروسه را دارید در واقع قصد فرستان یک سیگنال برای پروسه مورد نظر را دارید که این سیگنال ها شامل موارد زیر می شوند.
signal number | signal name | meaning |
---|---|---|
1 | SIGHUP | Informing the process that its controlling terminal (like an ssh connection) is terminated |
15 | SIGTERM | normal termination request |
9 | SIGKILL | forcefully kills the proccess |
تو حالت پیشفرض kill با سیگنال 15 کار می کند، یعنی به برنامه می گوید که خودت را ببند ولی سیگنال 9 خشن تر عمل می کند و بدون اطلاع به برنامه آن را قطع می کند.
برای kill کردن یک پروسس به صورت زیر عمل می کنیم:
$ kill -9 8733
در مثال بالا 8733 شماره پروسس آن می باشد، همچنین می توان از % نیز استفاده کرد.
دستور killall در لینوکس
این دستور هم مانند kill عمل می کند ولی به صورت گروهی سینگنال ارسال می کند، برای مثال ما چند job را در پس زمینه احرا کرده ایم:
$ jobs
[3] Running xeyes &
[5]- Running sleep 2000 &
[6]+ Running sleep 3000 &
که با دستور زیر هم می توانید تمام پروسس ای دی های آن را ببینید:
$ ps -ef | grep sleep
user01 7864 7651 0 21:07 pts/1 00:00:00 sleep 2000
user01 7865 7651 0 21:07 pts/1 00:00:00 sleep 3000
user01 7977 7651 0 21:14 pts/1 00:00:00 grep sleep
حالا با دستور killall همه sleep ها را می بندیم:
$ killall sleep
[5]- Terminated sleep 2000
[6]+ Terminated sleep 3000
و الان اگر دوباره jobs بگیریم فقط یک دستور xeyes
می ماند.
$ jobs
[3]+ Running xeyes &
$ ps -ef | grep sleep
user01 7980 7651 0 21:14 pts/1 00:00:00 grep sleep
مانیتورینگ پروسس ها در لینوکس
آموزش دستور ps در لینوکس
با دستور ps تمام پروسس هایی که فعال هستن را نمایش می دهد.
$ sleep 1000 &
[1] 7678
$ sleep 1001 &
[2] 7679
$ xeyes &
[3] 7680
$ ps
PID TTY TIME CMD
7651 pts/1 00:00:00 bash
7678 pts/1 00:00:00 sleep
7679 pts/1 00:00:00 sleep
7680 pts/1 00:00:00 xeyes
7681 pts/1 00:00:00 ps
حالا اگه بخواهید تمام پروسس ها را ببینید می توانید از دستور زیر استفاده کنید:
$ ps -aux
یا
$ ps aux
که برای مثال می توانید ببینید 293 پروسس درحال انجام است:
$ ps -aux | wc -l
293
پیدا کردن پروسس ها در لینوکس
برای این که یک پروسس را پیدا کنید راه های مختلفی وجود دارد، ما چند مورد آن را برسی می کنیم. یکی از راه ها استفاده از دستور grep می باشد:
$ ps -ef | grep gedit
user01 6213 4604 9 20:06 ? 00:04:43 gedit
user01 7725 7651 0 20:55 pts/1 00:00:00 grep gedit
سوئیچ ef مانند aux هست ولی در اینجا PPID یا Parent Process Id را نمایش می دهد.
یک راه دیگر این است که از سوئیچ C- استفاده کنید و سپس حتی می توانید بگویید چه مواردی را از آن به شما نمایش بدهد برای مثال ما user,pid,tty,time,comm را برای پروسس gedit می خواهیم:
$ ps -C gedit -o user,pid,tty,time,comm
USER PID TT TIME COMMAND
user01 6213 ? 00:04:49 gedit
همچنین می توانید با sort– آن ها را مرتب نیر بکنید، در اینجا + یعنی افزایشی و – یعنی کاهشی:
$ ps -af --sort +comm,-sid
UID PID PPID C STIME TTY TIME CMD
root 5486 5478 0 19:59 pts/12 00:00:00 -su
root 4444 1169 0 19:56 tty4 00:00:00 -bash
user01 6638 5412 0 20:10 pts/0 00:00:04 node /usr/local/bin/sslocal
user01 7778 7651 0 20:58 pts/1 00:00:00 ps -af --sort +comm,-sid
user01 7678 7651 0 20:48 pts/1 00:00:00 sleep 1000
user01 7679 7651 0 20:48 pts/1 00:00:00 sleep 1001
user01 7775 7651 0 20:58 pts/1 00:00:00 sleep 1000
user01 7776 7651 0 20:58 pts/1 00:00:00 sleep 1000
user01 7777 7651 0 20:58 pts/1 00:00:00 sleep 1000
root 5478 5477 0 19:59 pts/12 00:00:00 su -
root 5477 5008 0 19:59 pts/12 00:00:00 sudo su -
user01 7680 7651 0 20:48 pts/1 00:00:01 xeyes
دستور top در لینوکس
دستور top یک مانیتورینگ مفید سیستم است که واقعا ساده است برای استفاده و همچنین به ما اجازه ی درک اینکه چرا سیستم عامل ما از چه چیزی را متحمل می شود و اینکه چه فرایندی بیشترین منبع را استفاده می کند. دستور برای اجراکردن در ترمینال به صورت زیر است:
$top
برخی از سوئیچ های top به صورت زیر می باشد:
key during top | functionality |
---|---|
h | راهنما |
q | خروج |
M | با زدن Ctrl+Y بر اساس مموری مرتب می شود. |
c | اسم کامل دستور را نمایش می دهد. |
k | با این سوئیچ می توانید یک پروسس را ببندید. |
توضیحی راجع به نتیجۀ این دستور خدمت شما عرض کنم. در بالاترین بخش نتیجۀ این دستور اطلاعاتی راجع به حافظۀ اصلی و حافظۀ تبادلی و همچنین پردازنده را می توانید ببینید که علاوه بر اینجا از طریق دستورات دیگر هم می توانستیم به آنها برسیم. اما اینجا با دستور top هم قابل دسترس است. در خط اول (top) اطلاعاتی راجع به زمان سیستم و همچنین مدت زمانی که سرور روشن است، تعداد کاربرهایی که وارد حساب خود شدند و میانگین بار (load average) را می توانید ببینید.
در خط دوم اطلاعاتی راجع به وظیفه ها (task) را می توانید شاهد باشید. اینکه چه تعداد کل وظیفه ها هستند، چه تعداد از آنها همینک در حال اجرا هستند و اینکه چه تعداد از آنها خواب هستند.
خط سوم اطلاعاتی راجع به CPU را به ما نشان می دهد. اینکه چه مقدار از پردازنده توسط کاربران (0.0%us) استفاده می شود و چه مقدار توسط خود سیستم (0.3%sy) مهمترین اطلاعات این بخش را تشکیل می دهد.
خط چهارم اطلاعاتی راجع به حافظه اصلی (Mem) را به ما نشان می دهد.
خط پنجم حافظۀ تبادلی سیستم را نشان می دهد.
اما می رسیم به بخش اصلی دستور top که به صورت جدولی به ما نشان می دهد که چه پردازشی در حال حاضر چه مقدار حافظه، پردازنده مصرف می کند و توسط کدام کاربر در حال اجرا است. هر پردازش درون یک ردیف قرار دارد و ستون های مختلف اطلاعاتی راجع به پردازش ها را به ما نشان می دهند. مثلاً ستون اول (PID) شناسۀ پردازش را نشان می دهد.
- PID: شناسه پردازش. یک عدد منحصر به فرد مختص هر فرآیند
- USER: کاربری که پردازش توسط آن اجرا شده است.
- %CPU: درصد پردازنده این که این پردازش از آن استفاده می کند.
- %MEM: درصد حافظۀ اصلی که این پردازش از آن استفاده می کند.
- COMMAND: مسیر دستوری که این پردازش را اجرا کرده است.
اینها مهمترین ستون های جدول top بود. اما یک چندتا دستور ویرایشی روی top وجود دارد که آشنایی با آنها خالی از لطف نیست. می توانیم نتیجه ای که به ما بر می گرداند را سفارشی کنیم.
مرتب کردن نتایج
گاهی اوقات باید نتایجی که در این جدول به ما نشان داده می شود را براساس یک معیار مرتب کنیم. مثلاً شاید خواسته باشیم پردازش ها را یکی یکی براساس میزان مصرف cpu مرتب کنیم. برای این کار در حالی که وارد برنامه top شدید، ⇧ Shift+O را بزنید. به یک صفحۀ دیگر خواهید رفت. از اینجا با زدن حرف انگلیسی که کنار هر معیار وجود دارد باید تعیین کنید قرار است مرتب سازی با کدام معیار انجام شود.
مثلاً اگر می خواهید با معیار حافظۀ RAM این مرتب سازی انجام گیرد، باید n را از صفحه کلید بزنید. علامت * که کنار هر معیار وجود دارد، نشان می دهد که در حال حاضر معیار انتخابی برای مرتب سازی همان است. زمانی که این کار را انجام دادید، کلید Space را از صفحه کلید بزنید تا دوباره به قسمت اصلی top برگردید. الان باید نتایج بر اساس معیار انتخابی شما مرتب شده باشند.
تغییر جایگاه ستونها
برای اینکه جایگاه ستون ها را عوض کنید، باید در حالی که وارد برنامه top شدید o را بزنید. ستون های فعال که همینک در نتیجۀ دستور top موجود هستند با یک * در کنار آنها مشخص شدند. می توانید با زدن حرف متناظر با هر ستون، آن را به یک پله بالاتر بیاورید که با این کار آن ستون به یک پله سمت چپ جدول نزدیک خواهد شد.
با گرفت Shift و سپس زدن حرف متناظر، آن ستون به یک پله پایینتر خواهد آمد. در نهایت وقتی ستونهای جدول top را مرتب کردید Space را از صفحه کلید بزنید و از تنظیمات نحوۀ نمایش ستونها خارج شوید.
نمایش پردازشهای یک کاربر خاص
اگر قصد دارید فقط پردازش های مربوط به یک کاربر خاص را فهرست کنید، در محیط برنامه top کافی است دستور u را زده و سپس نام کاربر را وارد کنید. مثلا در تصویر زیر می بینید که ما پردازشهای مرتبط با کاربر jamal را فهرست کردیم. اگر میخواهید پردازشهای همۀ کاربران نمایش داده شوند، u را بزنید و بدون اینکه نام کاربر خاصی را وارد کنید، Enter را بزنید.
از آنجایی که این کاربر هنوز وارد حساب خود نشده است، پس پردازشی به اسم آن درون سیستم نیست. پس نتیجهای را هم در بر نخواهد داشت.
رنگی کردن پردازشهای در حال اجرا
اگر میخواهید بدانید که همینک پردازشهای در حال اجرا کدامها هستند، کافی است z را از صفحه کلید بزنید. به همین راحتی پردازشهایی که به رنگ قرمز در میآیند همان هایی هستند که در حال اجرایند.
نمایش مسیر مطلق پردازشها
برای نمایش مسیر کامل و مطلق هر پردازش کافی است c را بزنید؛ البته زمانی که برنامه top بالاست. میبینید که ستون COMMAND تغییراتی را به خود میبیند. مسیرها از حالت نسبی به مطلق تبدیل میشوند.
تغییر مدت زمان به روز شدن نتایج دستور top
به طور پیش فرض هر 3 ثانیه یک بار نتایج دستور top به روز میشود. اگر میخواهید این مدت زمان را کم و یا زیاد کنید، کافی است d را از صفحه کلید بزنید و مدت زمان مورد نظرتان را البته به ثانیه وارد کنید و Enter را بزنید. مثلاً ما 1 را وارد میکنیم. حالا هر یک ثانیه نتایج دستور top به روز میشود.
خاموش کردن یک پردازش
جالب است بدانید از درون برنامه top هم میتوانید پردازشی را ببندید که اگر این پردازش مرتبط با یک نرم افزار یا بستۀ نرم افزاری باشد، آن نرم افزار هم بسته یا خاموش خواهد شد. برای این کار اول باید وارد برنامه top شده و k را از صفحه کلید زده و سپس شماره پردازشی که قرار است خاتمه داده شود را وارد کنید. شماره فرآیند هر پردازش در ستون PID نشان داده شده است.
مرتب کردن نتایج با معیار میزان مصرف پردازنده (CPU)
برای اینکه فوراً نتایج را بر اساس میزان مصرف پردازنده مرتب کنید، Shift+P را از صفحه کلید وارد کنید. فوراً این کار برای شما انجام خواهد شد.
تغییر اولویت هر پردازش (Renice)
هر پردازش یک اولویتی برای خودش دارد که از درون برنامه top میتوانید این اولویت را تغییر دهید. بدین جهت r را زده سپس شماره پردازش (PID) را وارد کنید و Enter را بزنید. پس از آن شماره اولویت را وارد کرده و Enter را بزنید. کار تمام است.
ذخیره نتیجۀ دستور top
گاهی مواقع شاید نیاز داشته باشید پیکربندی دستور top را در جایی ذخیره کنید. محل ذخیره شده در پوشۀ root مدیر سرور خواهد بود. یعنی؛
/root/.toprc
پس از کلیدهای ترکیبی Shift+W برای این کار استفاده کنید.
راهنمای دستور top
در محیط top حرف h را از صفحه کلید بزنید، راهنمای این برنامه به شما نشان داده خواهد شد. راهنمایی ساده اما در عین حال مفید، که به انگلیسی است اما به سادگی میتوان نکات خوبی را از آن فرا گرفت.
خروج خودکار از برنامه top پس از n بار بارگذاری مجدد
اگر میخواهید پس از تعداد مشخصی تازه سازی نتایج دستور top به صورت خودکار از برنامه خارج شوید، کافی است از مشخصۀ n به شکلی که در زیر نمایش داده شده استفاده کنید. از این مشخصه باید زمانی استفاده کنید که قصد اجرا کردن top را دارید.
$ top -n 10
این بود از توضیحات کامل اما به زبان سادۀ آموزش دستور top که به عنوان مدیر سرور لینوکس یا حتی مدیر یک رایانۀ شخصی لینوکس باید آنها را یاد میداشتید. اطلاعات دستور top بسیار کاربردی است و در خیلی از مواقع ما به آن محتاجیم. البته باید این نکته را هم یادآور شوم که برنامههای کاملتری نسبت به برنامه top وجود دارد که به نوعی دارای امکانات بیشتری هستند. مثل نرم افزار htop یا iotop
آموزش دستور free در لینوکس
حافظۀ اصلی سرور یا همان RAM یکی از سخت افزارهای گران قیمت سروری است که شما خریداری میکنید. به همین دلیل مدیریت صحیح آن روی صرفه جویی در هزینهها و همچنین بهینه کار کردن برنامه های کاربردی که روی سرور نصب و اجرا شدند تاثیر به سزایی دارد. دستوراتی هم برای گرفتن اطلاعاتی راجع به RAM سرور لینوکس وجود دارند که ما در اینجا میخواهیم با دستور free بیشتر آشنا شویم. دستوری ساده که شاید در طول کار مدیریت سرور خود صدها بار از آن استفاده کنید. اما تفسیر نتایج آن شاید کمی مشکل باشد.
بدون اینکه کار زیادی خواسته باشید انجام دهید، خط فرمان سرور لینوکس خود را باز کرده و دستور free را درون آن بزنید. ببینید چه چیزی به شما بر خواهد گشت.
در تصویر بالا شما سه نوع دستور free را خواهید دید. نوع اول که همان دستور بدون مشخصه است که میزان کل حافظه RAM و همچنین میزان خالی و پر آن را میبینید. واحد این اعداد کیلوبایت است که به نظر میرسد واحدی بسیار کوچک است. برای اینکه این اعداد به مگابایت نمایش داده شود بهتر است از مشخصۀ -m به مانند دستور دوم در دستور بالا استفاده کنید:
$ free -m
total used free shared buffers cached
Mem: 7871 5231 2640 332 169 2195
-/+ buffers/cache: 2866 5005
Swap: 7627 0 7627
اما ما از یک مشخصۀ دیگر هم اسفاده کردیم که آن مشخص -s به همراه یک مقدار عددی است. واحد این عدد ثانیه است. این مشخصه به لینوکس میفهماند که هر چند ثانیه یک بار خروجی این دستور را مجدد به شما نشان دهد. اگر خواسته باشید به طور متوالی خروجی این دستور را بدون اینکه کار زیادی انجام دهید ببینید، باید از این مشخصه به روش زیر استفاده کنید. مثلاً دستور زیر هر 2 ثانیه یک خروجی جدید از دستور free به شما میدهد.
$ free -m -s 2
تفسیر دستور free در سرور لینوکس
اما می رسیم به تفسیر نتایج دستور free که موضوع اصلی از اینجا شروع میشود. پس به نتیجۀ این دستور کار داریم و خط به خط از بالا به پایین پیش خواهیم رفت. بالاترین خط که همان خط عنوان است که عنوان هر ستون را در بالاترین قسمت نوشته است.
خط اول خروجی دستور free مربوط به میزان استفاده شده از حافظۀ RAM سرور است. اینکه مقدار کل RAM چه مقدار است که چه مقدار از آن استفاده شده و چه مقدار از آن هنوز خالی است. توجه داشته باشید که به هر میزان برنامه یا سرویس روی سرور شما در حال اجرا باشد، میزان RAM بیشتری هم به صورت پر شده است.
خط دوم مربوط به میزان پر یا خالی بودن buffers/Cache سرور است.
خط سوم هم میزان پر یا خالی بودن swap را نشان میدهد. swap همان حافظۀ تبادلی است که روی حافظۀ سخت شما قرار گرفته است. برای اینکه سرور لینوکس از سرعت خوبی برخوردار گردد، در خیلی از مواقع از Hard سرور شما هم برای ذخیره سازی اطلاعات RAM سرور استفاده می شود. به این قسمت از حافظۀ سخت swap گفته میشود.
به عنوان کاربر سرور لینوکس باید بدانید هر کدام ازاین اعداد چه معنی دارند. پس اجازه دهید بیشتر وارد عمق قضیه شویم و خط اول خروجی را ریزتر بررسی کنیم.
total used free shared buffers cached Mem: ۴۹۹ ۱۳۲ ۳۶۶ ۰ ۲۲ ۴۱ -/+ buffers/cache: ۶۷ ۴۳۱ Swap: ۱۰۲۳ ۰ ۱۰۲۳
- total: عددی که در زیر این ستون نوشته شده 499 است که نشان می دهد کل RAM سیستم شما 499 مگابایت است. دقت داشته باشید که ما دستور را با مشخصۀ m به کار بردیم. پس واحد اعداد MB است.
- used: میزان حافظۀ استفاده شده یا همان پر شده از حافظۀ اصلی سیستم شما که در این جا با عدد 132 MB مشخص شده است. این مقدار شامل حجم دادههای buffers و cached شده روی حافظۀ اصلی هم هست.
- free: این هم مقدار حافظۀ اصلی است که هنوز پر نشده است و مقدار آن 366 MB است.
- shared: این مقدار حافظۀ اشتراکی است که به نظر میرسد در نسخههای بعدی برنامۀ free حذف شود. چون کاربردی ندارد.
- buffers: دادههای بافر شده روی RAM را نشان میدهد که توسط برنامههای کاربردی مختلف در حال اجرا استفاده شده است.
- cached: میزان دادههای کش شده روی RAM را که قرار است در آینده توسط نرم افزارها استفاده شود را نشان میدهد.
به همین ترتیب همین اطلاعات برای buffers/cache و همچنین حافظۀ تبادلی یا swap هم وجود دارد و شما مثلاً میتوانید ببینید که چه مقدار از حافظۀ تبادلی شما که در هنگام نصب سیستم عامل لینوکس تعیین کردید، پر شده و چه مقدار آن هنوز خالی است. هر کدام از این اعداد نکاتی را به ما یادآوری میکنند. مثلاً وقتی حافظۀ تبادلی یا Swap پر شود، این میتواند یک نشانه از کم بودن میزان حافظۀ RAM سرور شما باشد که باید به فکر ارتقاء آن باشید. یا اگر دیدید میزان دادههای cached زیاد است، باید برنامههایی که همینک در حال اجرا هستند را بررسی کنید ببینید آیا مشکلی در اجرای صحیح آنها وجود دارد یا خیر. برخی از سرویسها مثل سرویس وب سرور مثل Apache ممکن است با تنظیم اشتباه باعث بالا رفتن cached شود. که باید تنظیمات آن تصحیح گردد.
Buffer چیست؟
بافر مکانی موقتی برای ذخیره شدن دادههای یک برنامهی کاربردی خاص است که توسط برنامههای دیگر استفاده نمیشود. بافر مثل مفهوم پهنای باند است. وقتی شما سعی میکنید حجم عظیمی از دادهها را از یک شبکه عبور دهید که کارت شبکه قادر به عبور دادن آن مقدار داده نیست (یعنی سرعت لازم را ندارد)، کارت شبکه آن دادهها را به صورت بافر نگه میدارد تا به صورت مداوم و پیوسته انتقال دادهها با سرعت پایینتری انجام گیرد.
Cache چیست؟
از طرف دیگر Cache محلی روی حافظه است که دادههایی که به کرات از آنها استفاده میشود را برای دسترسی راحتتر نگه میدارد. اختلاف دیگر کش با بافر این است که Buffer فقط یک بار مورد استفاده قرار میگیرد. در حالی که دادههای Cache شده میتوانند چندین بار مورد استفاده قرار گیرند و هر دوی آنها به منظور انجام یک کار به صورت موقتی روی RAM نگهداری میشوند.
حالا میرویم سراغ اندکی محاسبه و جمع و تفریق! نگاه دوبارهای به نتیجۀ دستور free -m خواهیم داشت.
ما الان اینجا به خط دوم یعنی خطی که با
-/+ buffers/cache:
از نتیجۀ دستور free شروع شده است کار داریم. دو تا عدد روبروی آن میبینید که اولی از سمت چپ زیر ستون used و دومی زیر ستون free نوشته شده است. این اعداد به ترتیب میزان حافظۀ RAM مورد استفاده و خالی باقی مانده بدون در نظر گرفتن کش و بافر را نشان میدهند. پس طبیعی است که RAM استفاده شده در این ردیف کمتر و RAM آزاد بیشتر از مقدار ردیف قبلی باشند.
اما حالا میرویم سراغ یک جمع و تفریق ساده. RAM استفاده شده در خط اول 132 MB است که اگر از مقدار buffers و cached خط اول کمش کنیم، طبیعتاً باید عددی تقریباً برابر 67 به دست آید:
132 - (22 + 41) = 69
این از مقدار RAM استفاده شده بدون در نظر گرفتن بافر و کش. اما میرویم سراغ عدد دوم از خط دوم که جلوی عبارت buffers/cache و زیر ستون free نوشته شده است. اگر از محاسبۀ پایین سر در بیاورید و خودتان بتوانید تحلیلش کنید، همه چیز را یاد گرفتید و حالا یک قدم دیگر به درک کامل دستور free نزدیک تر شدید.
499 - 67 = 432
نتیجۀ محاسبات بالا با اعدادی که در نتیجه نمایش داده میشوند، اندکی فرق میکنند که این دلیل خاص خودش را دارد. مثلاً در محاسبۀ اخیر مقدار حافظۀ RAM آزاد بدون احتساب کش و بافر را 432 به دست آوردیم که از تفریق میزان حافظۀ مصرف شده از میزان کل RAM به دست آمد. اما در نتیجۀ دستور عدد 431 را به ما نشان میدهد که این اختلاف زیاد مهم نیست.
حافظه Swap یا تبادلی در سرور لینوکس
در لینوکس RAM فیزیکی به قطعاتی تقسیم میشود که به هر کدام صفحه یا page گفته میشود. کار تبادل حافظهای یا همان Swapping به فرآیندی گفته می شود که به موجب آن صفحات حافظۀ RAM روی قسمتهای از پیش پیکربندی شده روی حافظۀ سخت ریخته شده که به این بخش حافظۀ تبادلی یا Swap گفته میشود. این کار برای خالی کردن RAM مورد استفاده قرار میگیرد.
کار تبادل حافظهای به دو دلیل انجام میشود. دلیل اول این است که با این کار دادههایی که زیاد از آنها استفاده نمیشود روی حافظۀ سخت ریخته شده که باعث خالی شدن فضایی از حافظۀ اصلی برای اجرای برنامههای بیشتر و با سرعت بهتری میگردد. مخصوصاً اگر سرور از RAM کافی برخوردار نباشد. این کار را هستۀ سیستم عامل لینوکس انجام میدهد.
و دلیل دوم این است که خیلی از صفحههایی که باید به روی RAM بیایند همان اولی که سیستم راه اندازی میشود برای دادن مقدار اولیه کاربرد دارد و دیگر مورد استفاده قرار نمیگیرند. پس چه بهتر که روی حافظۀ سخت به جای RAM قرار گیرند که جا برای پردازشهای دیگر برنامهها یا فرآیندها باز شود.
باید اشاره کرد که این کار عیبهایی هم دارد. باید دقت کرد که سرعت انتقال داده در RAM به واحد میکروثانیه است. اما این سرعت در حافظۀ سخت میلی ثانیه است. پس اگر میزان RAM سیستم شما کم باشد و هسته مجبور گردد که میزان زیادی کار تبادل حافظهای را انجام دهد، این عمل باعث کند شدن شدید سرور شما خواهد شد. پس در این حالت حتماً باید به RAM سرور خود اضافه کنید تا سرعت بالا رود.
اما لینوکس از دو نوع Swap یا فضای تبادلی استفاده میکند؛
- فضای تبادلی پارتیشنی
- فضای تبادلی فایلی
فضای تبادلی پارتیشینی قسمتی از حافظۀ سخت است که منحصراً برای Swap مورد استفاده قرار میگیرد و هیچ نوع اطلاعات دیگری در آنجا نوشته نخواهد شد. در حالی که در فضای تبادلی فایلی از یک فایل به جای پارتیشن برای این کار استفاده میشود. معمولاً نوع اول بیشتر استفاده میشود و در هنگام نصب لینوکس باید این گام تعیین شود. اگر به صورت خودکار لینوکس را نصب کرده باشید، بدین صورت خواهد بود. اما اگر میخواهید بدانید که فضای تبادلی سرور لینوکس شما از کدام نوع است، باید از دستور زیر استفاده کنید:
swapon -s
دستوری ساده اما پر از اطلاعات که حتماً به دردتان خواهد خورد. از ستون Type قادرید نوع Swap را دریابید. حالا میرویم سراغ دستور free که یک قسمتش مربوط به حافظۀ تبادلی بود. دستور زیر را بزنید. فکر نکنم نیازی به توضیح باشد.
free -m
در خط آخر نتیجۀ دستور روبروی عبارت Swap: سه عدد نوشته شده که اولی زیر ستون total مجموع کل میزان حافظۀ تبادلی است که سیستم شما دارد. عدد موجود در زیر ستون used مقدار حافظۀ تبادلی است که تا به الان پر شده است و عدد آخر هم که در زیر ستون free است همان مقدار استفاده شدهی حافظهی تبادلی یا Swap سیستم شماست.
حالا از این اطلاعات چه استفادهای میتوان کرد؟ باید گفت زمانی که حافظۀ تبادلی سرور یا لینوکس شما به سرعت پر میشود، به نوعی نشان دهندهی کمبود در RAM سیستم شماست. مثلاً ممکن است نرم افزار وب سرور مثل آپاچی به دلیل بازدید بالا مقدار دادهای را در Swap ذخیره کند که باعث کند شدن شدید سیستم و دسترسی به صفحات سایتهای شما روی سرور خواهد شد. پس با در نظر گرفتن این موضوع میتوان مشکل را برطرف کرد و یا سخت افزار سرور را ارتقاء دهیم.
آموزش دستور uptime در لینوکس
منظور از Uptime در عرصۀ وب و طراحی سایت این است که چه میزان خدماتِ ما برای دیگران قابل دسترس بوده. مثلاً چه مقدار سایت ما برای بازدید کنندگان قابل نمایش بوده و قطعیهای متوالی که معمولاً برای فعالیتهای نگهداری سرور اعمال میشوند چطور بوده است. هر چقدر Uptime سایت یا سرور ما بالاتر باشد، نشان از پایدارتر بودن سایت ما از نظر دسترسی دیگران به آن است. در برخی از مواقع، مثل زمانی که از هاست اشتراکی استفاده میکنیم، امکان کنترل پایداری هاست خارج از دسترس ماست. اما اگر سایت ما روی سروری باشد که کنترل تمامی قسمتهای آن دست ماست، در این حالت باید تا جایی که میتوانیم مدت زمان روشن بودن یا همان Uptime سرور خود را بالا ببریم که برای این کار پیکربندیِ مناسب تمامی برنامه های نصب شده روی سرور خیلی مفید خواهد بود.
پس در اینجا فرض ما این است که شما به عنوان مدیر یک سرور لینوکس میخواهید بدانید سرور شما چه مدت زمانی روشن بوده یا اصطلاحاً Uptime آن چقدر است. سرورهای لینوکس به دلیل پایداری بالاتر آنها نسبت به ویندوز و همچنین گسسته بودن تمامی برنامههای روی آن از یکدیگر، معمولاً Uptime بالاتری هم دارند.
دستور uptime
بر همین اساس ما در لینوکس دستوری هم با عنوان uptime دارید که با زدن این دستور به راحتی میتوانید بفهمید که سرور شما چه مدت زمانی روشن بوده. گاهی از مواقع ممکن است سرور شما از نوع مجازی باشد و برای اینکه متوجه شوید آیا مدیر سرور اصلی سرور را خاموش کرده است یا نه، میتوانید از این دستور استفاده کنید. دستوری بسیار ساده، در عین حال بسیار کاربردی است.
uptime
نتیجهای که به ما بر میگردد:
# uptime 17:42:55 up 3 min, 1 user, load average: 0.06, 0.03, 0.00
در یک خط کل اطلاعاتی که ما راجع به میزان بالا بودن سیستم نیاز داریم را به ما بر میگرداند. از سمت چپ در ابتدا ساعت سیستم را به ما نشان میدهد. پس از آن هم مدت زمانی که سیستم روشن بوده. در نمونۀ بالا زده شده 3 min پس سه دقیقه از روشن شدن سیستم گذشته است. ولی مطمئناً برای سرور شما حتی باید ماهها روشن بوده باشد! لینوکس این گونه است. اینکه چه تعداد کاربر همینک وارد سیستم شدند هم مورد بعدی است. و در نهایت میانگین بار یا همان load average را هم میتوانستید ببنیید که در یک دقیقه گذشته، 5 دقیقه گذشته و 15 دقیقه گذشته نمایش می دهد.
دستور w
اگر دستور uptime برای شما نتایج کمی را بر میگرداند، بهتر است دستور w را امتحان کنید. این دستور نتایجی دقیقاً به مانند مورد بالا را نشان میدهد. البته با بسط بیشتر:
17:47:44 up 8 min, 1 user, load average: 0.00, 0.00, 0.00 USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/0 10.0.2.2 17:42 0.00s 0.06s 0.02s w
مشخصات ریز به ریز کاربرانی که همینک وارد سیستم شدند را هم نشان میدهد. در اصل دستور w ترکیبی از دستور uptime و who است که با یک تیر دو نشان را میتوانید بزنید.
تغییر اولویت اجرای پروسهها
همیشه تعداد بسیاز زیادی پروسس بر روی سیستم عامل و CPU فعال است و CPU نمیتواند همه پروسس ها را همزمان انجام دهد برای همین یک priority برای هر پروسسی که انجام می شود وجود دارد. ممکن است ما به دلایلی لازم داشته باشیم یک پروسس priority بیشتر یا کمتری از باقی پروسس ها داشته باشد، پس در ادامه توضیح می دهیم که چکاری باید انجام داد.
اگه به خروجی دستور top بالا نگاه کنید، یک ستون داریم که با NI نمایش داده شده است که به آن nice گفته می شود، nice یک عدد بین منفی بیست (20-) تا مثبت 19 می باشد.
هرچه عدد nice به منفی 20- نزدیک تر باشد یعنی پروسس اجازه استفاده بقیه از سی پی یو رو نمیده و اولویت بیشتری دارد و هرچه عدد به 19 نزدیک تر باشد اولویت کمتری دارد.
پیشفرض بیشتر برنامه ها nice 0 است
همچنین شما با دستور ps هم می توانید nice پروسس های خود را ببینید:
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 15044 15035 0 80 0 - 7453 wait pts/29 00:00:00 bash
0 S 1000 15052 15044 0 60 -20 - 3976 hrtime pts/29 00:00:00 sleep
0 R 1000 15080 15044 0 80 0 - 4680 - pts/29 00:00:00 ps
در صورتی که شما یک دستور جدید را با nice اجرا کنید، عدد پیشفرض شما بجای این که 0 باشد 10 می باشد، به این معنی که اگر بر روی یک سرور حساس دارید کار می کنید پرسس جدید شما کمترین اختلال را بر روی باقی پروسس ها اعمال می کند.
$ nice sleep 9000 &
$ ps -l
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
0 S 1000 15044 15035 0 80 0 - 7455 wait pts/29 00:00:00 bash
0 S 1000 15217 15044 0 90 0 - 12522 poll_s pts/29 00:00:00 xeyes
0 R 1000 15218 15044 0 80 10 - 4680 - pts/29 00:00:00 ps
شما با دستور nice و سوئیچ n- می توانید عدد nice مورد نظر را از 20- تا 19 مشخص کنید:
$ nice -n -20 echo "I am running!"
nice: cannot set niceness: Permission denied
I am running!
$ sudo nice -n -20 echo "I am running!"
I am running!
$ sudo nice -n 19 echo "I am running!"
I am running!
دو نکته مهم:
- در صورتی که بخواهید nice زیر 0 بدید باید دسترسی روت داشته باشید.
- اگر شما روت نباشید و درخواست nice زیر صفر 0 داده باشید، دستور اجرا می شود ولی با nice صفر 0 و یک پیغام خطا هم نمایش می دهد مانند مثال بالا
تغییر nice پروسس درحال اجرا
دستور renice به شما کمک می کند که یک پروسسی که درحال اجرا است را نیز NI آن را تغییر دهید، فکر کنید فایرفاکس در حال اجرا است:
$ ps -ef | grep firefox
user01 13605 11226 30 08:28 ? 00:10:13 /usr/lib/firefox/firefox
user01 15192 15044 0 09:01 pts/29 00:00:00 grep firefox
حال با دستور زیر و شماره process ID آن می توانید nice آن را تغییر دهید، برای مثال ما تغییر دادیم به منفی ده (10-)
$ sudo renice -n -10 13605
13605 (process ID) old priority 5, new priority -10