کانال تلگرام منطقه لینوکسی ها
نمایش نتایج: از 1 به 1 از 1

موضوع: آنچه که شما باید درباره process ها در لینوکس بدانید

  1. #1
    مدیر ارشد
    تاریخ عضویت
    Jan 2013
    محل سکونت
    Tehran
    نوشته ها
    1,328
    تشکر ها
    302
    57
    میزان امتیاز
    6
    Array

    آنچه که شما باید درباره process ها در لینوکس بدانید

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

    یک پروسس در حقیقت به یک برنامه در حال اجرا تلقی میشود در واقع نمونه ی در حال اجرا از یک برنامه است که شامل ساختار آن برنامه، فراخوانی Data از فایل ها، سایر برنامه ها یا ورودی از یک کاربر در سیستم است.

    همچنین توصیه میشود مطالعه کنید :
    پشت صحنه داستان ‘init’ و ‘systemd’: چرا در لینوکس ‘init’ باید جایگزین ‘systemd’ شود


    انواع Process ها

    اساسا دو نوع پروسس در لینوکس وجود دارد.

    - پروسس های Foreground : (همچنین با عنوان یک پروسس interactive (تعاملی) شناخته میشوند)
    این چنین process هایی از طریق یک session ترمینال شروع و کنترل میشوند. به عبارت دیگر باید یک کاربر متصل به سیستم برای شروع کردن این چنین پروسس هایی وجود داشته باشد و خودشان به صورت اتوماتیک به عنوان بخشی از Function یا service های سیستم استارت نمیشوند.

    - پروسس های Background : (همچنین با عنوان پروسس های اتوماتیک و non-interactive (غیر تعاملی) شناخته میشوند)
    این پروسس ها در حقیقت به ترمینال متصل نیستند و از ورودی هیچ کاربری به حساب نمیآیند.


    Daemon چیست ؟

    انواع خاصی از پروسس های background هستند که به هنگام startup سیستم start میشوند و همیشه به عنوان یک سرویس در حال اجرا میمانند. آنها هرگز متوقف نمیشوند، آنها به عنوان تسک های سیستمی (به عنوان سرویس) خود به خود استارت میشوند. به هر حال آنها میتوانند توسط یک کاربر و از طریق پروسس init کنترل شوند.

    processstate-png


    ایجاد یک Process در Linux

    یک پروسس جدید زمانی ایجاد میشود که یک process موجود یک کپی دقیق از خودش در مموری ایجاد کند. child process محیط یکسانی همانند parent خودش خواهد داشت و تنها شماره process id متفاوت خواهد بود.

    دو راه آسان برای ایجاد یک Process جدید در لینوکس مورد استفاده قرار میگیرد.

    - استفاده از فانکشن System() :
    این روش نسبتا آسان است به هر حال این روش ناکارآمد است و ریسک ها امنیتی بارزی دارد.

    استفاده از فانکشن fork() و exec() :
    این تکنیک نسبتا پیشرفته بوده و انعطاف پذیری و سرعت بالا به همراه امنیت را بهمراه دارد.


    لینوکس چگونه Process ها را شناسایی میکند ؟

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

    و یک برنامه در حقیقت به واسطه process ID یا PID آن و Process ID مربوط به parent (که PPID نامیده میشود) شناسایی میشود، بنابراین پروسس ها به دو دسته زیر گروه بندی میشوند.

    Parent Processes :
    پروسس هایی هستند که process های دیگر را در طول مدت زمان اجرای خود ایجاد میکنند.

    Child Processes :
    این پروسس ها توسط process های دیگر در طول مدت زمان اجرا ایجاد میشوند.


    پروسس Init :

    پروسس init در حقیقت مادر (parent) همه پروسس ها روی سیستم است و در حقیقت اولین برنامه ایست که به هنگام بوت شدن سیستم لینوکس اجرا میشود. این process همه پروسس های دیگر را روی سیستم مدیریت میکند و توسط خود کرنل استارت میشود بنابراین قانونا هیچ گونه پروسس parent ی ندارد.

    همیشه process id مربوط به process init عدد 1 میباشد. این پروسس همانند والدینی (parent) است که پروسس های بدون parent را سرپرستی یا به اصطلاح به فرزند خواندگی قبول میکنند.

    شما میتوانید از دستور pidof برای پیدا کردن ID یک پروسس استفاده کنیم.
    کد PHP:
    # pidof systemd
    # pidof top
    # pidof httpd 
    find-linux-process-id-linux-zone-org-png


    برای پیدا کردن process ID و parent process ID در شل جاری دستور زیر را اجرا کنید.
    کد PHP:
    $ echo $$
    $ echo 
    $PPID 
    find-linux-parent-process-id-linux-zone-org-png



    Start کردن یک Process در Linux

    به محض اینکه شما یک دستور یا برنامه را اجرا میکنید (برای مثال cloudcmd – CloudCommander) این برنامه یک پروسسی را در سیستم آغاز میکند. شما میتوانید یک پروسس Forground (یا interactive) را استارت کنید که به ترمینال و یک کاربری که میتواند به آن ورودی ارسال کند متصل شود.
    کد PHP:
    # cloudcmd 
    start-linux-interactive-process-linux-zone-org-png


    Job های Background در Linux

    برای استارت کردن یک پروسس در محیط بک گراند (یا non-interactive) از نشانه "&" استفاده میکنیم در اینجا پروسس تا زمانیکه به forground منتقل نشود از یک کاربر ورودی نمیخواند.
    کد PHP:
    # cloudcmd &
    # jobs 
    start-linux-process-background-linux-zone-org-png

    شما همچنین میتوانید یک پروسس را با suspend کردن آن با استفاده از Ctrl + z به بک گراند ارسال کنید، این کار سیگنال SIGSTOP را به پروسس ارسال خواهد کرد تا عملیاتش را متوقف کند و به حالت idel در بیاید.
    کد PHP:
    # tar -cf backup.tar /backups/*  #press Ctrl+Z
    # jobs 
    برای اجرای مجدد دستور suspend شده بالا در background، دستور bg را استفاده میکنیم.
    کد PHP:
    # bg 
    برای ارسال یک پروسس background به forground از دستور fg به همراه job ID مورد نظر شبیه به زیر استفاده میکنیم.
    کد PHP:
    # jobs
    # fg %1 
    linux-background-process-jobs-linux-zone-org-png


    همچنین شما میتوانید مقاله زیر را مطالعه فرمایید.
    نحوه start کردن دستورات لینوکسی در Background و جدا کردن پروسس از ترمینال


    مراحلی که یک Process در Linux طی میکند

    در طول اجرا یک پروسس بسته به محیط/شرایط خود، از یک حالت به حالت دیگر تغییر میکند. در لینوکس یک پروسس مراحل زیر را طی میکند.

    Running :
    این حالت از Process زمانیست که پروسس جاری در سیستم در حال اجراست یا آماده اجرا شدن است (منتظر برای اختصاص یافتن به یکی از CPU ها)

    Waiting :
    در این حالت یک پروسس در حالت انتظار برای رخ دادن یک event یا منتظر یک ریسورس سیستم میباشد. علاوه بر این همچنین کرنل بین دو نوع پروسس های در حال انتظار تفاوت قائل میشود. پروسس های در حال انتظار که قابل لغو هستند میتوان به واسطه سیگنال ها لغو شوند و نوع دوم پروسس های در حال انتظار غیر قابل لغو که مستقیما روی شرایط سخت افزار در حال انتظار هستند و نمیتوان آنها را با استفاده از هیچ گونه event/signal لغو کرد.

    Stopped :
    در این حالت یک پروسس متوقف شده است که معمولا با استفاده از دریافت یک سیگنال این اتفاق رخ میدهد برای مثال یک پروسسی که دیباگ شده متوقف میشود.

    Zombie :
    این حالت زمانیست که یک پروسس به اصطلاح میمیرد در حقیقت پروسسی است که halt (خاموش/از بین رفته) شده اما هنوز یک ردیف در جداول process دارد.


    نحوه نمایش Process های فعال در Linux

    آبزارهای لینوکسی زیادی برای نمایش/لیست کردن پروسس های در حال اجرا روی سیستم، وجود دارد. دو نمونه از ابزارهای شناخته شده و قدیمی دستورات ps و top هستند.

    1 - دستور ps

    این دستور اطلاعات درباره مجموعه ای از پروسس های فعال روی سیستم را همانند زیر نمایش میدهد.
    کد PHP:
    # ps 
    # ps -e | head 
    list-linux-archive-processes-linux-zone-org-png


    2 - دستور top - ابزار مانیتورینگ سیستم

    top یک ابزار قدرتمند است که به شما یک نمایش لحظه ای (realtime) و داینامیک از سیستم در حال اجرا همانند تصویر زیر ارائه میدهد.
    کد PHP:
    # top 
    list-linux-running-processes-linux-zone-org-png


    برای مطالعه مثالهای کاربردی بیشتر از دستور top پیشنهاد میشود لینک زیر را مطالعه کنید.
    12 نمونه مثال از دستور top در linux


    3 - glances - ابزار مانیتورینگ سیستم

    glances یکی از ابزارهای مانیتورینگ نسبتا جدید در سیستم است و قابلیت های پیشرفته ای دارد.
    کد PHP:
    # glances 
    glances-linux-process-monitoring-linux-zone-org-png

    برای بررسی یک راهنمای تکمیلی درباره استفاده از این دستور پیشنهاد میشود پست زیر را مطالعه فرمایید.
    ابزار glances یک ابزار پیشرفته و realtime برای مانیتورینگ سیستم در لینوکس


    چندین ابزار مانیتورینگ مفید دیگر برای لینوکس موجود است که شما میتوانید برای لیست کردن process های فعال از آنها استفاده کنید. لینک زیر را باز کنید و درباره آنها بیشتر مطالعه کنید.
    20 دستور کامندی برای مانیتور کردن عملکرد لینوکس (به زودی)
    13 ابزار مفید برای مانیتورینگ لینوکس (به زودی)


    نحوه کنترل Process ها در لینوکس

    همچنین در لینوکس یکسری دستور به منظور کنترل کردن پروسس ها موجود است دستوراتی مانند kill, pkill, pgrep, و killalll که در زیر چند مثال پایه درباره نحوه استفاده از آنها مشاهده میکنید.
    کد PHP:
    pgrep -u mohammad top
    kill 2308
    pgrep -u mohammad top
    pgrep -u mohammad glances
    pkill glances
    pgrep -u mohammad glances 
    control-linux-processes-linux-zone-org-png


    برای یادگیری عمیق نحوه استفاده از این دستورات و kill یا خاتمه دادن به پروسس های اکتیو در لینوکس لینک های زیر را مطالعه کنید.
    آموزش دستورات kill, pkill و killall برای خاتمه دادن به Process ها در لینوکس
    نحوه پیدا کردن و Kill کردن Process ها در لینوکس
    تفاوت بین Grep, Egrep و Fgrep در لینوکس چیست ؟

    دقت کنید زمانیکه سیستم شما هنگ کرده است شما میتوانید از دستورات بالا برای kill کردن اپلیکیشن های بی مسئولیت در لینوکس استفاده کنید.


    ارسال Signal به Process ها

    اساسی ترین راه برای کنترل پروسس ها در لینوکس توسط ارسال سیگنال به آنهاست. چندین سیگنال وجود دارد که شما میتوانید به یک پروسس ارسال کنید برای مشاهده همه سیگنال ها دستور زیر را اجرا کنید.
    کد PHP:
    kill -
    list-all-linux-signal-linux-zone-org-png

    برای ارسال یک سیگنال به یک پروسس همانطور که قبلا هم به آن اشاره کردیم از دستورات kill, pkill و pgrep استفاده میکنیم. اما برنامه ها تنها در صورتی که به نحوی برنامه ریزی شده باشند که بتوانند این سیگنال ها را تشخیص دهند، میتوانند به سیگنال ها پاسخ دهند.

    و اکثر سیگنال ها برای استفاده داخلی توسط سیستم یا برنامه نویسان (به هنگامی که آنها کد نویسی میکنند) طراحی شده اند. در زیر سیگنال هایی که برای یک کاربر سیستمی مفید است مشاهده میکنید.

    SIGHUP 1 : هنگامی که ترمینال کنترل کننده پروسس بسته میشود این سیگنال به سمت process ارسال میگردد.

    SIGINT 2 : این سیگنال توسط ترمینال کنترل کننده پروسس زمانیکه کاربر پروسس را با فشار دادن Ctrl+c لغو میکند، به سمت process ارسال میگردد.

    SIGQUIT 3 : اگر کاربر با فشار دادن Ctrl+D یک سیگنال خروج ارسال کند این سیگنال به سمت پروسس ارسال میگردد.

    SIGKILL 9 : این سیگنال فورا یک پروسس را خاتمه داده (kill میکند) و پروسس حتی زمانی برای اجرا کردن هیچ گونه عملیات clean-up ندارد.

    SIGTERM 15 : این سیگنال مربوطه به خاتمه دادن یک برنامه است (دستور kill به صورت پیش فرض این سیگنال را ارسال خواهد کرد)

    SIGTSTP 20 : این سیگنال توسط ترمینال کنترل کننده پروسس و برای درخواست از پروسس برای متوقف کردن (terminal stop) به سمت پروسس ارسال میشود که از طریق user و با فشردن Ctrl+Z آغاز میشود.


    در زیر نمونه مثال هایی از دستور kill به منظور kill کردن اپلیکیشن firefox با استفاده از PID آن (زمانیکه فایرفاکس هنگ کرده است) را مشاهده میکنید.
    کد PHP:
    pidof firefox
    kill 9 2687
    OR
    kill -KILL 2687
    OR
    kill -SIGKILL 2687 
    برای kill کردن یک اپلیکیشن با استفاده از نام آن همانند زیر از دستورات pkill یا killall استفاده میکنیم.
    کد PHP:
    pkill firefox
    killall firefox 

    تغییر اولویت Process در Linux

    روی سیستم لینوکس تمام پروسس های active یک اولویت و مقدار nice مشخص به خود اختصاص میدهد. پروسس هایی با اولویت بالاتر معمولا نسبت به پروسس هایی با اولویت پایینتر CPU Time بیشتری را دریافت میکنند.

    به هر حال یک کاربر سیستم با دسترسی root میتواند با دستورات nice و renice روی این فضیه تاثیر بگذارد.

    از خروجی دستور top و در ستون NI شما میتوانید مقدار nice پروسس ها را مشاهده کنید.
    کد PHP:
    top 
    list-linux-running-processes-linux-zone-org-png

    از دستور nice برای تعریف کردن مقدار nice برای یک پروسس استفاده میکنیم. در خاطر داشته باشید که کاربران معمولی میتوانند مقدار nice را از 0 تا 20 به پروسس هایی که خودشان owner آنها هستند اختصاص دهند.

    تنها کاربر root میتواند مقدارهای منفی برای nice استفاده کند.

    برای renice کردن اولویت یک پروسس همانند زیر از دستور renice استفاده میکنیم.
    کد PHP:
    renice +8  2687
    renice +8  2103 
    در زیر میتوانید چندین مقاله مفید درباره بررسی نحوه مدیریت و کنترل پروسس های لینوکسی را مطالعه فرمایید.
    مدیریت Process های لینوکسی : Boot, Shutdown و هر پروسسی که ما بین این دو میباشد. (به زودی)
    پیدا کردن 15 پروسس اول که میزان استفاده مموری آنها بالاتر است، با استفاده از دستور top در Batch Mode
    پیدا کردن Process های در حال اجرا با میزان مصرف بالای Memory و CPU در Linux
    نحوه پیدا کردن نام یک Process با استفاده از شماره PID آن در Linux

    اگر هرگونه سوال یا ایده ی بهتری دارید در همین پست با ما به اشتراک بگذارید.
    ویرایش توسط Habili : 08-10-2017 در ساعت 09:51 AM
    voip trainer - Asterisk - Elastix - Agi Programming- NewRock

    Voip Expert :ASTERISK-ELASTIX-NewRock Certified-With Experience of Working With
    Sangoma-Digium-Openvox-Synway-Atcom-Quintum Tenor-Polycom-Yealink-Rtx-Snom
    Cisco Collaboration - CME-CUCM-CUPs-CUC-WEBEX
    LPI ( Fundamental - LPI1 and LPI2 ) - Monitoring: ZABBIX-VOIPMONITOR-NAGIOS - CCNA

    Linkedin Profile : http://www.linkedin.com/profile/view...15&trk=spm_pic


موضوعات مشابه

  1. CPUTool ابزاری برای کنترل و محدود کردن میزان مصرف CPU به واسطه هر Process در لینوکس
    توسط Habili در انجمن نرم افزارهای مانیتورینگ و مدیریت شبکه لینوکسی
    پاسخ: 0
    آخرين نوشته: 06-15-2017, 11:46 AM
  2. پاسخ: 0
    آخرين نوشته: 02-21-2017, 11:10 AM
  3. پاسخ: 0
    آخرين نوشته: 08-02-2016, 10:12 AM
  4. مانیتور کردن cpu, ram و process در لینوکس با htop
    توسط Server-Sec در انجمن نرم افزارهای مانیتورینگ و مدیریت شبکه لینوکسی
    پاسخ: 7
    آخرين نوشته: 01-11-2016, 03:04 PM

کلمات کلیدی این موضوع

مجوز های ارسال و ویرایش

  • شما نمیتوانید موضوع جدیدی ارسال کنید
  • شما امکان ارسال پاسخ را ندارید
  • شما نمیتوانید فایل پیوست کنید.
  • شما نمیتوانید پست های خود را ویرایش کنید
  •  
درباره ما
سایت منطقه لینوکسی ها در سال 1392 با هدف ارائه خدمات نوین در حوزه فناوری اطلاعات و ارتباطات در راستای پیاده سازی ارتباطات صدا، تصویر، دیتا و بالا بردن سطح علمی و عمومی کاربران از طریق انجمن در سطح جهانی راه اندازی شده و با بهره گیری از توان تخصصی و تجارب حرفه ای مدیران و کارشناسان خود، پیشگام بودن در ارائه راه کارهای برتر را آرمان خود قرار داده است. امید است این سایت بتواند زمینه ساز رشد و ترقی جامعه ایرانی در سرتاسر دنیا گردد.
شبکه های اجتماعی
ایمیل مدیر کل
habili@linux-zone.org