ارتباط با فرایند از طریق سیگنال
در لینوکس، ارتباط با یک فرایند در حال اجرا از طریق سیگنال (signal) انجام میشود. سیگنال
یک پیام کوتاه به هسته است که آن را به فرایند مقصد میرساند. دستور kill با وجود نامش، فقط برای
کشتن فرایند نیست؛ در واقع ابزاری برای ارسال هر نوع سیگنال است.
› پایان مؤدبانه، فرایند میتواند قبل از خروج پاکسازی کند
kill -TERM 4521
kill 4521 # پیشفرض همان TERM است
› پایان اجباری، بدون هیچ فرصتی برای پاکسازی
kill -KILL 4521
kill -9 4521
› خواندن مجدد فایل پیکربندی بدون ریاستارت کامل
kill -HUP 4521
› ارسال سیگنال به همه فرایندهای یک نام
killall -TERM nginx
pkill -f "python manage.py"
تفاوت SIGTERM و SIGKILL بسیار مهم است: SIGTERM قابل مدیریت (handle) توسط برنامه است و به آن فرصت میدهد فایلهای باز را ببندد و تراکنشها را کامل کند؛ اما SIGKILL توسط هسته مستقیماً اجرا میشود و برنامه هیچ فرصتی برای واکنش ندارد. به همین دلیل همیشه باید ابتدا SIGTERM را امتحان کرد و فقط در صورت عدم پاسخ سراغ SIGKILL رفت.
در اسکریپتهای bash نیز میتوان با دستور trap واکنش به سیگنالها را کنترل کرد؛ برای مثال
گرفتن SIGINT (کلید Ctrl+C) برای اجرای یک تابع پاکسازی قبل از خروج:
cleanup() {
echo "در حال پاکسازی منابع..."
rm -f /tmp/lockfile
exit 0
}
trap cleanup SIGINT SIGTERM
یک نکته کاربردی دیگر، سیگنال SIGHUP است که در گذشته برای اطلاع دادن به یک برنامه از قطع اتصال ترمینال استفاده میشد، اما امروزه بیشتر برای دستور دادن به یک سرویس جهت خواندن مجدد فایل پیکربندی، بدون نیاز به ریاستارت کامل و از دست دادن اتصالات فعال، به کار میرود؛ برای مثال nginx با دریافت SIGHUP، پیکربندی جدید را میخواند بدون اینکه درخواستهای در حال پردازش قطع شوند. شناخت این تفاوت بین سیگنالهای مختلف، به شما کمک میکند بهجای همیشه استفاده از SIGKILL برای متوقف کردن هر چیزی، روش مناسبتر و کمآسیبتر را برای هر موقعیت انتخاب کنید.