# فصل هشتم: پردازش‌ها و سرویس‌ها در لینوکس

## Linux Processes and Services

هر برنامه هنگام اجرا به یک یا چند **پردازش (Process)** تبدیل می‌شود. مدیریت پردازش‌ها، Jobهای Shell و سرویس‌های systemd از مهارت‌های اصلی مدیریت لینوکس است.

> دستورهای این فصل را روی یک سیستم آزمایشی اجرا کنید. پیش از متوقف‌کردن پردازش یا سرویس، نام و PID آن را دوباره بررسی کنید.

---

# Program و Process

Program فایل اجرایی ذخیره‌شده روی دیسک است؛ Process نمونه‌ای در حال اجرای آن برنامه است. هر پردازش یک شناسه یکتا به نام **PID**، یک پردازش والد با **PPID**، مالک، وضعیت و منابع اختصاص‌یافته دارد.

پردازش با PID شمارهٔ 1 در سیستم‌های مبتنی بر systemd معمولاً خود `systemd` است:

```bash
ps -p 1 -o pid,comm,args
```

---

# مشاهده پردازش‌ها

نمایش پردازش‌های ترمینال فعلی:

```bash
ps
```

نمایش همهٔ پردازش‌ها با قالب رایج:

```bash
ps aux
```

نمایش درخت رابطهٔ والد و فرزند:

```bash
ps -ef --forest
```

جست‌وجوی مطمئن‌تر بر اساس نام برنامه:

```bash
pgrep -a nginx
```

`pidof` نیز PID برنامه‌ای با نام دقیق را نمایش می‌دهد:

```bash
pidof sshd
```

---

# پایش زنده منابع

`top` مصرف CPU و حافظه را به‌صورت زنده نشان می‌دهد:

```bash
top
```

`htop` رابط تعاملی‌تری دارد، اما ممکن است ابتدا نیاز به نصب داشته باشد. برای مشاهدهٔ حافظه و میانگین بار سیستم نیز می‌توان از این دستورها استفاده کرد:

```bash
free -h
uptime
```

میانگین بار (`load average`) درصد CPU نیست؛ تعداد تقریبی کارهای قابل اجرا یا منتظر I/O را در بازه‌های ۱، ۵ و ۱۵ دقیقه نشان می‌دهد و باید نسبت به تعداد CPUهای منطقی تفسیر شود.

---

# سیگنال‌ها و دستور kill

`kill` برخلاف نامش الزاماً پردازش را فوراً نمی‌کشد؛ یک **signal** برای PID می‌فرستد. روش صحیح، شروع با `SIGTERM` است تا برنامه فرصت پاک‌سازی داشته باشد:

```bash
kill -TERM PID
```

شکل کوتاه آن:

```bash
kill PID
```

فقط اگر پردازش پس از مهلتی معقول پاسخ نداد از `SIGKILL` استفاده کنید:

```bash
kill -KILL PID
```

`SIGKILL` قابل مدیریت یا نادیده‌گرفتن نیست و ممکن است باعث باقی‌ماندن دادهٔ ناقص شود. برای ارسال سیگنال بر اساس نام:

```bash
pkill -TERM -x program-name
```

گزینهٔ `-x` از تطبیق ناخواستهٔ نام‌های مشابه جلوگیری می‌کند.

---

# Foreground، Background و Job Control

دستوری که مستقیم در Shell اجرا می‌شود معمولاً در Foreground است. افزودن `&` آن را در Background همان Shell اجرا می‌کند:

```bash
sleep 300 &
```

Jobهای همان Shell:

```bash
jobs -l
```

کلید `Ctrl+Z` به‌طور معمول `SIGTSTP` می‌فرستد و کار را **متوقف** می‌کند؛ آن را خاتمه نمی‌دهد. سپس می‌توان Job را ادامه داد:

```bash
bg %1
fg %1
```

شمارهٔ `%1` شناسهٔ Job در همان Shell است، نه PID سیستم. برای اجرای کاری که پس از خروج از نشست باقی بماند، از ابزارهایی مانند `tmux`، یک سرویس systemd، یا در موارد ساده `nohup` استفاده کنید.

---

# اولویت پردازش‌ها

مقدار nice معمولاً از `-20` (اولویت زمان‌بندی بیشتر) تا `19` (کمتر) است. کاربر عادی می‌تواند اولویت پردازش خود را کاهش دهد:

```bash
nice -n 10 long-command
renice 15 -p PID
```

افزایش اولویت، مانند تعیین مقدار منفی، معمولاً به دسترسی ویژه نیاز دارد. nice تضمین سهم مشخصی از CPU نیست و سیاست زمان‌بندی Kernel نیز مؤثر است.

---

# Service و systemd

Service برنامه‌ای پس‌زمینه برای ارائهٔ یک قابلیت مداوم است. در بسیاری از توزیع‌های امروزی، systemd مدیر سرویس و راه‌اندازی سیستم است. نام unit باید مشخص باشد؛ پسوند `.service` در بسیاری از دستورها قابل حذف است.

مشاهدهٔ وضعیت:

```bash
systemctl status ssh.service
```

در Debian/Ubuntu معمولاً نام سرویس `ssh.service` و در برخی توزیع‌ها `sshd.service` است. نام واقعی را پیدا کنید:

```bash
systemctl list-unit-files --type=service | grep -E '^(ssh|sshd)\.service'
```

شروع، توقف و راه‌اندازی مجدد:

```bash
sudo systemctl start nginx.service
sudo systemctl stop nginx.service
sudo systemctl restart nginx.service
```

`reload` در صورت پشتیبانی، تنظیمات را بدون restart کامل بارگذاری می‌کند:

```bash
sudo systemctl reload nginx.service
```

فعال‌کردن برای Boot با شروع فوری:

```bash
sudo systemctl enable --now nginx.service
```

غیرفعال‌کردن اجرای خودکار با توقف فوری:

```bash
sudo systemctl disable --now nginx.service
```

`enable` به‌تنهایی سرویس را همان لحظه شروع نمی‌کند و `disable` نیز به‌تنهایی سرویس در حال اجرا را متوقف نمی‌کند.

---

# مشاهده Logها با journalctl

Log یک سرویس در Boot فعلی:

```bash
journalctl -u nginx.service -b
```

دنبال‌کردن پیام‌های جدید:

```bash
journalctl -u nginx.service -f
```

نمایش خطاهای Boot فعلی:

```bash
journalctl -b -p err
```

خواندن بعضی پیام‌ها به عضویت در گروه مناسب یا `sudo` نیاز دارد.

---

# تمرین‌های فصل هشتم

1. با `ps -ef --forest` رابطهٔ چند پردازش را بررسی کنید.
2. `sleep 300` را در پس‌زمینه اجرا کنید و با `jobs`، `fg` و `bg` مدیریت کنید.
3. PID آن را با `pgrep -a sleep` پیدا و ابتدا با `SIGTERM` متوقف کنید.
4. وضعیت یک سرویس موجود را با `systemctl status` ببینید؛ بدون دلیل سرویس حیاتی را متوقف نکنید.
5. Log همان سرویس را برای Boot فعلی با `journalctl` مشاهده کنید.

---

# جمع‌بندی

در این فصل تفاوت Program، Process، Job و Service؛ مشاهده و اولویت‌بندی پردازش‌ها؛ ارسال صحیح signal؛ و مدیریت سرویس‌ها و Logهای systemd را آموختیم.
