بخشی از مقاله
مديريت پردازشprocess management
1-7- مقدمه
يك processيك برنامه در حال اجرا ميباشد . سيستم unix براي كنترل نمودن process هاي در حال اجرا برنامه هاي مختلفي را فراهم ساخته است . بي شك برنامه ps مهمترين برنامه از اين نوع ميباشد كه وضعيت process هاي كنوني شما را نشان ميدهد .
هنگاميكه process ها در صحنه اجرا ميشوند ، ميتوان بوسيله سيگنال هائيكه از صفحه كليد ارسال ميگردد آنها را متوقف نمود . اما براي مديريت process هائيكه در زمينه اجرا ميگردند با استفاده از فرمان kill آنها را متوقف ميسازيم .
ديگر فراميني كه در اين فصل مورد بررسي قرار ميگيرد امكان تغيير دادن محيط process ها را فراهم ميسازند . فرمان nice اولويت اجراي process را كاهش ميدهد تا process هاي ديگر بيشتر مورد توجه قرار گيرند . فرمان nohup اين امكان را در اختيار شما قرار ميدهد كه پس از خروج از سيستم process شما همچنان در حال اجرا باقي بماند . فرمان at اين امكان را در اختيار شما قرار ميدهد كه برنامه اي را در زمانيكه شما تعيين مي نمائيد به اجرا در بيايد .
2-7- گزارش وضعيت process ها
فرمان ps
يك برنامه در حال اجراء رايك process مينامند وهر process بوسيله يك شماره واحد شناخته ميشودبه اين شماره PID وياشماره مشخصه process ميگويند. process هاي باشماره مشخصه process1. 0 هاي ويژه سيستم ميباشند. process شماره صفرkernel سيستم unix ميباشدو process شماره init process .1 نام دارد. اين process وظيقه برپاسازي ساختار process ها را بر عهده دارد . در سيستم unix تمام process ها توسط process ديگر ايجاد ميشوند كه به آن process پدر ميگويند. پدرويابه تعبيري ديگر پدر بزرگ تمام process ها process شماره 1 ميباشد.
شماره مشخصه بقيه process ها در محدوده 2 تا 30.000 قراردارد .برنامه ps نه تنها pid هابلكه اطلاعات ديگر ي درمورد process هاي در حال اجراءرا نمايش ميدهد.براي مثال جهت مشاهده وضعيت process هاي اجراءشده در زمينه ويامشخص نمودن pid براي خاتمه دادن به process كه درزمينه در حال اجراء ميباشد از فرمان ps استفاده ميكند همچنين از فرمان ps براي مشاهده
process هائي كه توسط ديگر استفاده كنندگان به اجراءدر آمده استفاده ميكنيم.
اگرهيچ opthion رادر سطرفرمان ps اختصاص ندهيدتنها اطلاعات مربوط به process هاي ترمينال كنترلي خودرامشاهده خواهيدكرد.
$ ps
pid tty time command
25 2b 0:09 sh
156 2b 0:01 ps
$
چهارفيلدخروجي عبارتنداز شماره مشخصه process ونام ترمينال كنترلي. زمان مصرف شده براي اجراي فرمان ونام فرمان.
معمولا process ها ازطريق يك ترمينال كنترلي به اجراء در مي آيند .اگر يك process كه درزمينه اجراءميگردد به ترمينال كنترلي اختصاصي نيافته باشد به آن daemon process ويا daemons ميگويند. براي مشاهده وضعيت يك process خاص بصورت زير عمل نمائيد
$ ps_ p25
pid tty time command
25 01 0:09 sh
$
براي اجراءكردن يك process درزمينه در انتهاي سطرفرمان علامت(E) راقراردهيد در اينصورت اجراي process شروع ميگردد بدون آنكه ترمينال شما منتظر خاتمه يافتن اجراي process گردد .
$ ls _ lr / >/ dev/ null e
157
$
هنگاميكه اجراي يك process در زمينه شروع ميشود shell يك شماره بعنوان شماره مشخصه process نشان ميدهد . در مثال فوق عدد 157 شماره مشخصه process است كه در زمينه اجراء نموده ايم . خروجي فرمان ls كه به صورت بازگشتي از ريشه به اجراء در ميايد بصورت استاندارد بر روي صفحه ترمينال ما ظاهر ميگردد كه ما با تغيير مسير دادن آن به فايل null از اينكار جلو
گيري نموده ايم .
$PS PID TTY TIME COMMAND
25 2b O:O9 SH
157 2b O: P3 LS- LR
158 2b O:O1 PS
$
اگر فرمان PS را بعد از چند لحظه دوباره به اجراء در بياوريد مشاهده خواهيد كرد كه زمان مصرف شده براي فرمان ils اضافه ميشود.
$PS
PID TTY TIME COMMAND
25 2b O:O9 SH
157 2b O: 4 LS – LR
158 2b O:O1 PS
$
تا بحال از فرم كوتاه فرمانps استفاده نموديم براي استفاده ا زفرم بلند خروجي فرمان ps از L ـ در سطر فرمان ps استفاده نمائيد .
$ ps – l
F S UID PID PPID C PRI NI ADDR S2 WCHAN TTY TIME CMD
1 S USEN 2 25 1 0 30 20 39 32 CHILD 2B 0: 10 SH
1 R USEN 2 160 25 13 56 20 46 64 2B 0: 01 PS
$
البته ممكن است كه اعداد خروجي فرمان PS با آنچه كه شما بر روي ترمينال خود مشاهده ميكنيد تفاوت داشته باشد .
در اينجا شرح مختصري در مورد فيلدها و اطلاعات موجود در آنها رابيان مي نمائيم .
lag : f اختصاص داده شده به process
01 : در حافظه
02 : system process
4 : براي i/o فيزيكي در حافظه قفل شده
10 : در حال swap
20 : بوسيله process ديگري رديابي ميگردد.
S : حالت process
S: SLEEP
W : منتظر WAIT
R : در حال اجراء run
I: مياني INTErMEDIATE
Z : خاتمه يافته
T : متوقف شده
UID : اسم استفاده كننده مالك process
PID : شماره مشخصه process
PPID : شماره مشخصه براي پدر process
C : زمان مصرف شده CPU براي زمانبندي process
PRI : الويت process ( اعداد بزرگتر – اولويت كمتر را نشان ميدهند )
NI : عددي كه در محاسبه اولويت استفاده ميگردد .
ADDR : اگر process در حافظه باشد اين عدد آدرس حافظه را نشان ميدهد و در غير اينصورت آدرس ديسك ميباشد .
SZ : اندازه process در حافظه
WCHAN : هنگاميكه يك process تقاضائي دارد كه در دسترس نميباشد process تا زمان مهيا شدن نيازش بايد منتظر بماند . علت انتظار process بصورت يك آدرس در اين فيلد نوشته ميشود . اگر فيلد خالي باشد process در حال اجراء ميباشد .
TTY : اسم ترمينال كنترلي process
TIME : زمان مصرف شده براي اجراي process
با استفاده از فرمان PS ميتوانيد تمام process هاي در حال اجراء را مشاهده نمايد . براي اينكار ميتوانيد از –EL در سطر فرمان PS استفاده نمائيد.
$PS – EL
F S UID PID PPID C PRI NI ADDR SZ WCHAN TTY TIME CMD
3 S
0 0 45 0 20 1D 8 NUNOUT ? 570:08 SWAPPEL
1 S 1 0 0 30 20 2 9 40 CHIED ? 0:01 INIT
1 S 26 1 0 28 20 3D 32 TTY(O) 2C 0:05 GETTY
1 S USEN2 30 1 0 30 20 39 32 HILD 2B 0:10 SH
1 R USEL2 161 30 13 56 20 46 64 2B 0:01 PS
1 S 21 1 0 40 20 4A 40 SLEEP ? 1:12 CLON
$
3=7-خاتمه دادن به يك process
فرمان KILL
گاهي از اوقات لازم است كه اجراي يك process را كه شما شروع نموده ايد متوقف سازيد . مثلا برنامه آنطور كه شما مايل بوديد عمل نميكند و يا اينكه ديگر نيازي به اجراي برنامه اي كه در زمينه اجرا نموديد نداريد . يك برنامه كه در زمينه اجراء ميگردد نه تنها بوسيله وقفه بلكه بوسيله سيگنال quit هم خاتمه نمي يابد ، زيراshell process , هاي زمينه را از سيگنال ها محفوظ نگاه ميدارد . اما بوسيله ارسال سيگنال نرم افزاري خاتمه ، ميتوانيد يك process را كه در زمينه در حال اجراء شدن است خاتمه دهيد . زيرا shell در مقابل اين signal محافظتي انجام نميدهد .
براي ارسال يك سيگنال نرم افزاري به يك process از فرمان kill با قالب زير استفاده نمائيد .
$ kill ( - signal – no ) pid
در اينجا pid شماره مشخصه process ميباشد كه بلافاصله پس از اجراي process در زمينه توسط shell نمايش داده ميشود . اگر شماره مشخصه process را فراموش كرديد با استفاده از فرمان ps شماره مشخصه process مورد نظر خود را بدست آوريد . هنگاميكه فرمان ps را صادر ميكنيد تمام process هائيكه هم اكنون به ترمينال شما اختصاص داده شده اند نشان داده ميشوند . signal – no شماره سيگنالي است كه براي process ارسال ميگردد ليست سيگنال هاي عمومي بشرح زير ميباشد :
hup 1 زمانيكه خط تلفن قطع شود ارسال ميگردد. hang up ))
2 int هنگام فشار دادن كليد delete يا break ارسال ميگردد.
3 quit هنگام فشار دادن كليدهايctnl ”/” بطور همزمان ارسال ميگردد (interupt)
9 kill مطمئن ترين راه براي خاتمه دادن به يك process زيرا اين سيگنال را نمي
توان دريافت كرد و يا ناديده گرفت .
TERM 15 براي خاتمه دادن به يك process ارسال مي گردد . ميتوان آن راگرفت ويا اينكه ناديده انگاشت
هنگاميكه به يك process سيگنال شماره3 ارسال ميگردد cone image مربوط c debuger)) استفاده ميشود.
اگر در سطر فرمان kill شماره سيگنال را اختصاص ندهيد ، اجراي process نامبرده شده خاتمه مي يابد .
$ ls – lr / > / dev / null E
830
$ ps
pid tty time command
740 2b 0:07 sh
830 2b 0:00 ls _ lr /
83 1 2b 0:01 ps
$
اكنون سعي كنيد با فشار دادن كليد break و يا del به تمام process ها سيگنال وقفه ارسال نمائيد و سپس با استفاده از فرمان ps حاصل كار خود را مشاهده نمائيد .
$ (interrupt)
$ ( interrupt)
$ ps
pid tty time command
740 2b 0:07 sh
830 2b 0:20 ls_ lr /
832 2b 0:01 ps
$
همانطور كه مشاهده ميكنيد process شماره 830 كه در زمينه در حال اجراء ميباشد همچنان به كار خود ادامه ميدهد و سيگنالهاي ارسالي در كار آن وقفه اي ايجاد نمي كند . حال با استفاده از فرمان kill اين process را خاتمه دهيد .
830 $ kill
$ps
pid tty time command
740 2b 0:07 sh
834 2b 0:01 ps
$
پس از اجراي فرمان process kill . شماره 830 كه در زمينه در حال انجام بود خاتمه مييابد .
در برخي از سيستمها پس از اجراي فرمان kill پيامي بصورت زير بر روي صفحه مشاهده ميگردد.
$ 830 : termnated
و بدين صورت بشما اعلام ميدارد كه process با شماره مشخصه 830 واقعا خاتمه يافته است . گاهي اوقات برنامه ها طوري طراحي شده اند كه در مقابل سيگنال خاتمه مصونيت داشته باشند . در اين صورت برنامه signal بصورت فوق نميتواند process را خاتمه دهد . اگر چه شما ميتوانيد با اختصاص دادن signal _ no سيگنال شماره 9 را براي process ارسال نمائيد . اين سيگنال همواره ميتواند هر process را كه به شما تعلق دارد خاتمه دهد.
$ kill _ 9 pid
در اينصورت pid شماره مشخصه process ميباشد و 9ـ ارسال سيگنال شماره 9 را نشان ميدهد. اين روش مطمئن ترين راه براي خاتمه دادن به يك process ميباشد .
4-7- محافظت يك process از سيگنالهاي hangup, quit
فرمان nohup
بطور معمول ، هنگاميكه شما از سيستم unix خارج ميشويد ، تمام process هائيكه در زمينه شروع نموده ايد خاتمه مي يابند . موقعي كه شما logoll مي نمائيد ، kernel سيگنال hang up را براي تمام process هائيكه شما شروع نموده ايد ارسال ميدارد و آنها بوسيله اين signal خاتمه مي يابند .
اين رفتار سيستم در صورتيكه خط شما بصورت غير عمدي قطع شده باشد ، مطلوب نميباشد . مثلا اگر خط تلفن اشتباها قطع شده باشد ، شما انتطار نداريد كه process ها خاتمه يابند . در اينمورد ، خوشبختانه سيستم unix راه ساده اي براي ادامه اجراي process هاي در صحنه و يا در زمينه حتي بعد از اينكه شما logoll نموديد فراهم ساخته است .
و يا در زمينه حتي بعد از اينكه شما logoll نموديد فراهم ساخته است .
فرمان nohup اين امكان را فراهم ميسازد كه اجراي برنامه هاي شما هنگام logoll ادامه پيدا كند .
فرم كلي فرمان nohup بصورت زير ميباشد .
$ nohup command line
در اينجا command line يك سطر فرمان ميباشد ، در اينصورت هنگاميكه
شما logoll نمائيد ، برنامه nohup مانع از ارسال سيگنال خاتمه يافتن به command line ميشود . فرمان nohup تمام خروجيهاي حاصله از command line شامل خروجي استاندارد و خطاي استاندارد را در فايلي به نام nohup . out در فهرست راهنماي كنوني ذخيره مي كند . اگر اجازه نوشتن به اين فايل در فهرست راهنماي كنوني ايجاد نشده باشد ، خروجي ها براي فايلي به همين اسم در فهرست راهنماي خانگي شما ارسال ميگردد.
براي تمرين فرمان nohup ، يك فرمان مثلا ls _ lr را با استفاده از nohup در زمينه اجراء نمائيد . سپس logoll نموده و پس از چند دقيقه مجددا logon نمائيد و فايل nohup . out را مشاهده كنيد و بدين وسيله مشاهده ميكنيد كه فرمان صادره با موفقيت انجام شده است .
$ nohup ls _ lr / E
820
sending output to nohup. out
$ ( ^D)
login : user 2
password :
$ cat nohup . out
ممكن است سيستم شما پيام sending output to nohup ! out
را صادر ننمايد .
5 –7- اجراكردن يك process با اولويت كمتر
فرمان nice
اجراي يك process توسط cpu انجام ميشود. قطعاتي از زمان كه هنگام اجراي يك process توسط cpu به آن اختصاص داده ميشود را time slice مينامند . cpu; يك process را به اندازه يك time slice اجراء ميكندو سپس process بعدي را اجراء ميكند. اندازه time slice تحت تاثير اولويتي است كه kernel هنگام زمانبندي به هر process نسبت ميدهد . به process هائيكه اولويت بيشتري داشته باشند time slice هاي بزرگتري اختصاص داده ميشود .
گاهي از اوقات ممكن است كه بخواهيد يك برنامه را با اولويت كمتر از معمول اجراء نمائيد . بنابراين تقاضاي برنامه براي cup كاهش پيدا ميكند و به ديگر برنامه ها اندكي بيشتر زمان cpu اختصاص داده ميشود .
اگر به يك برنامه اولويت كمتري اختصاص داده شود ، اين برنامه نسبت به ديگر برنامه ها كندتر اجراء ميشود . برنامه هائي كه بيشتر از معمول از منابع سيستم استفاده ميكنند بيش از ديگر برنامه ها باعث كند شدن سيستم ميگردند. اين نوع برنامه ها كانديداهاي مناسبي براي اجرا نمودن با اولويت كمتر ميباشند . يك مثال مناسب ا زاين قبيل برنامه ها برنامه nroll ، برنامه قالب دهنده متن سيستم unix ميباشد . برنامه اي كه با اولويت كمتري اجرا ميشود مدت زمان بيشتري طول خواهد كشيد تا خاتمه يابد زيرا برنامه هائيكه اولويت كمتري دارند هنگام اجرا شدن قطعات كوچكتري از زمان cpu به آنها اختصاص داده ميشود .
فرمان nice اين امكان را در اختيار شما قرار ميدهد كه اولويت يك process را كاهش دهيد . سطر فرمان nice بصورت زير ميباشد .
$ nice ( - increment) command line
در اينجا command line يك سطر فرمان shell ميباشد . اگر از آرگومان – increment (كه محدوده آن 1 الي 19 ميباشد ) استفاده نمائيد آنگاه به مقدار nice فرضي process كه عدد 20 ميباشد اضافه ميشود ، در اينصورت كميت nice افزايش مييابد و باعث ميشود كه اولويت زمانبندي process كاهش يافته و در نتيجه قطعات زماني (time slic )spu كه قرار است به process اختصاص داده شوند كاهش يابند .
اگر – increment اختصاص داده نشود مقدار قراردادي 10 مورد استفاده قرار ميگيرد بنا براين عدد nice بدست آمده براي process عدد 30 خواهد بود .
استفاده كنندگان معمولي تنها ميتوانند اولويت process هاي خود را كاهش دهند اما superusen ( كسي كه با اسم استفاده كننده root از سيستم استفاده ميكند ) قادر است اولويت برنامه هاي خود را افزايش دهد. براي اين منظور بايد مقدار increment را به صورت يك عدد منفي وارد نمايد .