واچداگ ما سرویسهایی را که عمداً متوقف کرده بودیم، دوباره راهاندازی کرد
عملیات
یکی از واچداگهای ما هر سرویسی را که فعال است اما در حال اجرا نیست، راهاندازی میکند. دو بار در ماه اکتبر، سرویسهایی را که عمداً متوقف کرده بودیم، راهاندازی کرد. بار دوم، بازدیدکنندگان یکی از سایتهای ما حدود 45 دقیقه با خطا مواجه شدند.
چرا آن واچداگ وجود دارد
سرویسی که با دریافت سیگنال SIGTERM بهصورت تمیز خارج میشود، برای مثال چون چیزی آن را با نامش از بین برده است، از نظر systemd «ناموفق» محسوب نمیشود. Restart=on-failure آن را برنمیگرداند و systemctl --failed آن را فهرست نمیکند. این سرویس تا زمانی که کسی تصادفاً متوجه شود، پایین میماند. بنابراین واچداگ به دنبال سرویسهایی میگردد که فعال هستند اما در حال اجرا نیستند و آنها را راهاندازی میکند.
مشکل این است که سرویسی که دستی متوقف کردهاید، دقیقاً همان ظاهر را دارد.
بار اول
در 7 اکتبر، یک پردازشگر ویدیو را با systemctl stop در ساعت 12:47 برای ویرایش صف کارهایش متوقف کردیم. در ساعت 12:55 دوباره در حال اجرا بود: واچداگ آن را راهاندازی کرده بود.
بار دوم
در 21 اکتبر، برای یک تست مدل به حافظه ماشین نیاز داشتیم که دو مورد از سایتهای ما را نیز سرو میکرد. یک اسکریپت، اپلیکیشنهای وب سایتها، یک کار همگامسازی و یک کانتینر پایگاه داده را، باز هم با systemctl stop متوقف کرد. حدود پنج دقیقه بعد، یک تایمر که سایتها را زیر نظر دارد و در ساعت 19:14 واچداگ، تونل و اپلیکیشنهای وب را دوباره فعال کردند.
تونل دوباره ترافیک را پذیرفت، اما اپلیکیشنهای وب نمیتوانستند پاسخ دهند: مدل در حال تست، 114 گیگابایت از حافظه ماشین را در اختیار داشت. از حدود 19:14 تا 20:00، برخی از بازدیدکنندگان خطاهای 502 دریافت کردند. در ساعت 20:00، تونل، اپلیکیشنهای وب و کار همگامسازی را غیرفعال کردیم و تایمر نظارت را متوقف کردیم.
قاعدهای که اکنون استفاده میکنیم
- سرویس را با غیرفعال کردنش متوقف کنید:
sudo systemctl disable --now <unit>. باsudo systemctl enable --now <unit>آن را دوباره فعال کنید. واچداگ ما فقط به سرویسهای فعال نگاه میکند، بنابراین سرویس غیرفعال را رها میکند. - هر چیزی که میتواند آن را دوباره فعال کند را متوقف کنید: تونل جلوی آن و هر تایمری که آن را زیر نظر دارد.
- توقف کوتاه یک رقابت است. اگر فقط از
stopاستفاده میکنید، قبل از بررسی بعدی کارتان را تمام کنید، که در ماشینهای ما ظرف چند دقیقه انجام میشود.
دو تله دیگر از systemd در همان ماهها
systemctl mask --runtimeبرای فایل واحد در /etc/systemd/system هیچ کاری انجام نمیدهد. واحدهای موجود در /etc بر ماسک زمان اجرا در /run اولویت دارند، بنابراین دستور با موفقیت اجرا میشود اما سرویس همچنان شروع به کار میکند. برای نگهداشتن یک سرویس، از یک فایل drop-in باConditionPathExists=!/etc/<name>.holdاستفاده میکنیم: تا زمانی که آن فایل وجود دارد، سرویس نه در زمان بوت و نه به صورت دستی شروع به کار نخواهد کرد.systemctl is-activeیک سرویس oneshot در حال اجرا را غیرفعال گزارش میکند. در حالی که یک سرویسType=oneshotدر حال اجراست، وضعیت آن «activating» است، بنابراینis-activeهمان را چاپ کرده و کد 3 را برمیگرداند. حلقهای مانندwhile systemctl is-active --quiet job.service; do sleep 60; doneکه برای انتظار یک کار شبانه طراحی شده، بلافاصله خارج میشود. به جای آن وضعیت را بخوانید: active، activating، reloading یا deactivating همگی به معنای در حال اجرا بودن هستند.
Factory Floor سرویسهای فعالشدهای که در حال اجرا نیستند را رصد میکند. به طور پیشفرض فقط آنها را گزارش میدهد و تنها در صورتی آنها را راهاندازی میکند که شما این گزینه را فعال کنید. از نسخه 1.0.3، هشدار آن همچنین توضیح میدهد که چگونه میتوان یک سرویس را به صورت عمدی متوقف کرد و کتابچه راهنمای عملیاتی آن نیز همین را بیان میکند.