رفتن به محتوا
LoopX

آزمون بخش ۵: پروسه‌ها و سیستم

این آزمون چهار درس بخش «پروسه‌ها و سیستم» را می‌سنجد. جواب هر سؤال همان لحظه با توضیح نشان داده می‌شود و نتیجه‌ات در همین مرورگر ذخیره می‌شود (پیشرفت من).

؟ آزمون بخش ۵
  1. kill -9 را چه زمانی می‌زنی؟

  2. دستور jobs چه چیزی را نشان می‌دهد؟

  3. کدام حرف در ستون STAT خروجی ps یعنی پروسه zombie است؟

  4. nohup دستور & برای چیست؟

  5. سرویسی enabled است ولی الان inactive. بعد از ریبوت چه می‌شود؟

  6. در خروجی systemctl status علامت × (و failed) یعنی…

  7. کدام دستور لاگ یک سرویس را زنده دنبال می‌کند؟

  8. Restart=on-failure دارد و برنامه با کد خروج ۰ تمام می‌شود. چه می‌شود؟

  9. برای پیدا کردن اینکه کدام پوشه بیشترین جا را گرفته چه می‌زنی؟

  10. free فقط ۲۰۰ مگابایت است ولی available حدود ۲ گیگابایت. وضعیت؟

  11. load average ۰٫۵ روی سیستمی با ۸ هسته یعنی…

  12. df -h فضای زیادی نشان می‌دهد ولی ساخت فایل خطای No space left on device می‌دهد. اول چه بزنی؟

  13. DEBUG=1 python app.py چه اثری دارد؟

  14. اسکریپتی به نام ls در ~/bin هست و ~/bin اول PATH است. با ls چه اجرا می‌شود؟

  15. alias و تابع شخصی را در کدام فایل می‌نویسی تا در هر ترمینال تازه فعال باشند؟

  16. چرا alias داخل یک اسکریپت bash کار نمی‌کند؟

🏁 چالش: سرویس نظارت بر دیسکسخت

یک سرویس کوچک بساز که ۴ درس این بخش را کنار هم بگذارد (روی ماشین systemd‌دار آزمایشی):

۱. اسکریپت /usr/local/bin/lx-disk-watch.sh: هر ۵ ثانیه با df درصد پر بودن / را بخواند و اگر از متغیر محیطی THRESHOLD (پیش‌فرض ۸۰) بیشتر یا مساوی بود، خط WARNING و در غیر این صورت OK چاپ کند. ۲. یک unit file با Environment=THRESHOLD=1 (تا هشدار فوراً فعال شود)، Restart=always و WantedBy=multi-user.target. ۳. با systemctl enable --now راهش بینداز و با journalctl -u هشدارها را نشان بده. ۴. ثابت کن متغیر واقعاً در محیط پروسه هست (با systemctl show و /proc/PID/environ). ۵. پروسه‌ی اصلی را با kill -9 بکش و ثابت کن systemd دوباره راهش انداخت (PID جدید). ۶. همه‌چیز را پاک کن.

راهنمایی

برای درصد: df --output=pcent / | tail -1 | tr -dc '0-9'. در unit: Environment=THRESHOLD=1. PID اصلی: systemctl show -p MainPID --value نام. محیط پروسه: tr '\0' '\n' < /proc/PID/environ.

راه‌حل
cat > /usr/local/bin/lx-disk-watch.sh <<'EOF'
#!/bin/bash
LIMIT="${THRESHOLD:-80}"
while true; do
used=$(df --output=pcent / | tail -1 | tr -dc '0-9')
if [ "$used" -ge "$LIMIT" ]; then echo "WARNING: دیسک ${used}% پر است (آستانه ${LIMIT}%)"; else echo "OK: دیسک ${used}% پر است"; fi
sleep 5
done
EOF
chmod +x /usr/local/bin/lx-disk-watch.sh
cat > /etc/systemd/system/lx-disk-watch.service <<'EOF'
[Unit]
Description=Disk usage watcher (challenge)
[Service]
Environment=THRESHOLD=1
ExecStart=/usr/local/bin/lx-disk-watch.sh
Restart=always
RestartSec=1
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now lx-disk-watch
sleep 2
echo "== ۳) لاگ سرویس"
journalctl -u lx-disk-watch -n 2 --no-pager -o cat
echo "== ۴) متغیر در محیط پروسه"
systemctl show -p Environment lx-disk-watch
pid=$(systemctl show -p MainPID --value lx-disk-watch)
tr '\0' '\n' < /proc/$pid/environ | grep '^THRESHOLD='
echo "== ۵) kill -9 و ریستارت خودکار"
echo "PID قبل: $pid"
kill -9 $pid
sleep 3
echo "PID بعد: $(systemctl show -p MainPID --value lx-disk-watch) | ریستارت‌ها: $(systemctl show -p NRestarts --value lx-disk-watch) | وضعیت: $(systemctl is-active lx-disk-watch)"
echo "== ۶) پاک‌سازی"
systemctl disable --now lx-disk-watch
rm -f /etc/systemd/system/lx-disk-watch.service /usr/local/bin/lx-disk-watch.sh
systemctl daemon-reload
خروجی
Created symlink /etc/systemd/system/multi-user.target.wants/lx-disk-watch.service → /etc/systemd/system/lx-disk-watch.service.
== ۳) لاگ سرویس
Started lx-disk-watch.service - Disk usage watcher (challenge).
WARNING: دیسک 6% پر است (آستانه 1%)
== ۴) متغیر در محیط پروسه
Environment=THRESHOLD=1
THRESHOLD=1
== ۵) kill -9 و ریستارت خودکار
PID قبل: 586
PID بعد: 600 | ریستارت‌ها: 1 | وضعیت: active
== ۶) پاک‌سازی
Removed "/etc/systemd/system/multi-user.target.wants/lx-disk-watch.service".