tutorials / linux / chapter-08.md · utf-8 ⬇ download chapter-08.md
فصل هشتم: پردازشها و سرویسها در لینوکس
Linux Processes and Services
هر برنامه هنگام اجرا به یک یا چند پردازش (Process) تبدیل میشود. مدیریت پردازشها، Jobهای Shell و سرویسهای systemd از مهارتهای اصلی مدیریت لینوکس است.
دستورهای این فصل را روی یک سیستم آزمایشی اجرا کنید. پیش از متوقفکردن پردازش یا سرویس، نام و PID آن را دوباره بررسی کنید.
Program و Process
Program فایل اجرایی ذخیرهشده روی دیسک است؛ Process نمونهای در حال اجرای آن برنامه است. هر پردازش یک شناسه یکتا به نام PID، یک پردازش والد با PPID، مالک، وضعیت و منابع اختصاصیافته دارد.
پردازش با PID شمارهٔ 1 در سیستمهای مبتنی بر systemd معمولاً خود systemd است:
ps -p 1 -o pid,comm,args
مشاهده پردازشها
نمایش پردازشهای ترمینال فعلی:
ps
نمایش همهٔ پردازشها با قالب رایج:
ps aux
نمایش درخت رابطهٔ والد و فرزند:
ps -ef --forest
جستوجوی مطمئنتر بر اساس نام برنامه:
pgrep -a nginx
pidof نیز PID برنامهای با نام دقیق را نمایش میدهد:
pidof sshd
پایش زنده منابع
top مصرف CPU و حافظه را بهصورت زنده نشان میدهد:
top
htop رابط تعاملیتری دارد، اما ممکن است ابتدا نیاز به نصب داشته باشد. برای مشاهدهٔ حافظه و میانگین بار سیستم نیز میتوان از این دستورها استفاده کرد:
free -h
uptime
میانگین بار (load average) درصد CPU نیست؛ تعداد تقریبی کارهای قابل اجرا یا منتظر I/O را در بازههای ۱، ۵ و ۱۵ دقیقه نشان میدهد و باید نسبت به تعداد CPUهای منطقی تفسیر شود.
سیگنالها و دستور kill
kill برخلاف نامش الزاماً پردازش را فوراً نمیکشد؛ یک signal برای PID میفرستد. روش صحیح، شروع با SIGTERM است تا برنامه فرصت پاکسازی داشته باشد:
kill -TERM PID
شکل کوتاه آن:
kill PID
فقط اگر پردازش پس از مهلتی معقول پاسخ نداد از SIGKILL استفاده کنید:
kill -KILL PID
SIGKILL قابل مدیریت یا نادیدهگرفتن نیست و ممکن است باعث باقیماندن دادهٔ ناقص شود. برای ارسال سیگنال بر اساس نام:
pkill -TERM -x program-name
گزینهٔ -x از تطبیق ناخواستهٔ نامهای مشابه جلوگیری میکند.
Foreground، Background و Job Control
دستوری که مستقیم در Shell اجرا میشود معمولاً در Foreground است. افزودن & آن را در Background همان Shell اجرا میکند:
sleep 300 &
Jobهای همان Shell:
jobs -l
کلید Ctrl+Z بهطور معمول SIGTSTP میفرستد و کار را متوقف میکند؛ آن را خاتمه نمیدهد. سپس میتوان Job را ادامه داد:
bg %1
fg %1
شمارهٔ %1 شناسهٔ Job در همان Shell است، نه PID سیستم. برای اجرای کاری که پس از خروج از نشست باقی بماند، از ابزارهایی مانند tmux، یک سرویس systemd، یا در موارد ساده nohup استفاده کنید.
اولویت پردازشها
مقدار nice معمولاً از -20 (اولویت زمانبندی بیشتر) تا 19 (کمتر) است. کاربر عادی میتواند اولویت پردازش خود را کاهش دهد:
nice -n 10 long-command
renice 15 -p PID
افزایش اولویت، مانند تعیین مقدار منفی، معمولاً به دسترسی ویژه نیاز دارد. nice تضمین سهم مشخصی از CPU نیست و سیاست زمانبندی Kernel نیز مؤثر است.
Service و systemd
Service برنامهای پسزمینه برای ارائهٔ یک قابلیت مداوم است. در بسیاری از توزیعهای امروزی، systemd مدیر سرویس و راهاندازی سیستم است. نام unit باید مشخص باشد؛ پسوند .service در بسیاری از دستورها قابل حذف است.
مشاهدهٔ وضعیت:
systemctl status ssh.service
در Debian/Ubuntu معمولاً نام سرویس ssh.service و در برخی توزیعها sshd.service است. نام واقعی را پیدا کنید:
systemctl list-unit-files --type=service | grep -E '^(ssh|sshd)\.service'
شروع، توقف و راهاندازی مجدد:
sudo systemctl start nginx.service
sudo systemctl stop nginx.service
sudo systemctl restart nginx.service
reload در صورت پشتیبانی، تنظیمات را بدون restart کامل بارگذاری میکند:
sudo systemctl reload nginx.service
فعالکردن برای Boot با شروع فوری:
sudo systemctl enable --now nginx.service
غیرفعالکردن اجرای خودکار با توقف فوری:
sudo systemctl disable --now nginx.service
enable بهتنهایی سرویس را همان لحظه شروع نمیکند و disable نیز بهتنهایی سرویس در حال اجرا را متوقف نمیکند.
مشاهده Logها با journalctl
Log یک سرویس در Boot فعلی:
journalctl -u nginx.service -b
دنبالکردن پیامهای جدید:
journalctl -u nginx.service -f
نمایش خطاهای Boot فعلی:
journalctl -b -p err
خواندن بعضی پیامها به عضویت در گروه مناسب یا sudo نیاز دارد.
تمرینهای فصل هشتم
- با
ps -ef --forestرابطهٔ چند پردازش را بررسی کنید. sleep 300را در پسزمینه اجرا کنید و باjobs،fgوbgمدیریت کنید.- PID آن را با
pgrep -a sleepپیدا و ابتدا باSIGTERMمتوقف کنید. - وضعیت یک سرویس موجود را با
systemctl statusببینید؛ بدون دلیل سرویس حیاتی را متوقف نکنید. - Log همان سرویس را برای Boot فعلی با
journalctlمشاهده کنید.
جمعبندی
در این فصل تفاوت Program، Process، Job و Service؛ مشاهده و اولویتبندی پردازشها؛ ارسال صحیح signal؛ و مدیریت سرویسها و Logهای systemd را آموختیم.