سامانه ثبتنام آموزشگاه زبان رهنما در رشت هر روز بعدازظهر کند میشود و حوالی ساعت شش خطا میدهد، و صبح روز بعد بدون اینکه کسی کاری کرده باشد سالم است. هیچ چیز از کار نیفتاده: پروسهها سر جایشاناند، دیسک جا دارد و شبکه بیعیب است. در خروجی free -h عدد قابل استفاده available است، نه free، و همین یک ستون پرونده را در سه دقیقه بست.
کند شدن یک خبر است نه یک احساس، و سیستمعامل خبرش را دارد. چیزی که آن را از دسترس بیرون نگه میدارد این است که هیچکدام از چهار کار اصلی این لایه اسمی روی میزکار ندارند، و خرابی هرکدامشان لباس آن یکی را میپوشد: کمبود حافظه شبیه کندی پردازنده دیده میشود، و مشکل دسترسی شبیه خرابی نرمافزار.
چهار کاری که انجام میدهد و اسمش را نمیبرد
سیستمعامل میزکار نیست. چیزی است که تصمیم میگیرد پروسه بعدی کدام است، چه کسی اجازه دارد کدام فایل را باز کند، هرکدام چقدر حافظه نگه دارند، و وقتی دو برنامه همزمان یک دستگاه را میخواهند چه اتفاقی میافتد. هیچکدام تا وقتی درست کار میکنند دیده نمیشوند، و به همین دلیل کارهایی که هیچوقت نمیبینید انجامشان میدهد خوشهای است که بقیه را خواندنی میکند. این چهار کار همان چیزی هستند که کامپیوتر، شبکه، و زیرساختی که زیر بقیه نشسته از هر لایه بالاتری میخواهد.
چهار خروجی، و ستونی که همه اشتباه میخوانند
free -h- میدهد
Mem: 7.7Gi 7.1Gi 180Mi 0B 420Mi 240Mi
ستون سوم، یعنی free، روی هر لینوکس سالمی نزدیک صفر است و هیچ اشکالی هم ندارد؛ هسته حافظه بلااستفاده را نگه نمیدارد و آن را پر میکند از چیزهایی که هر لحظه میتواند دور بریزد. ستون آخر، available، همان چیزی است که یک برنامه تازه میتواند بگیرد. روی دستگاه رهنما این عدد بعدازظهرها به ۲۴۰ مگابایت میرسید، و هرکسی که به ستون free نگاه کرده بود ماهها بود همان نتیجه اشتباه را میگرفت.
خروجی دوم بار متوسط است و آن هم اشتباه خوانده میشود. بار متوسط ۴ روی ۴ هسته یعنی درست پر، و عدد بالاتر یعنی صف: عدد تعداد کارهایی است که یا در حال اجرا هستند یا منتظرند، پس روی همان دستگاه چهار هستهای عدد ۹ یعنی پنج کار ایستادهاند، و هیچکدام از این اعداد درصد پردازنده نیستند. روی دستگاه رهنما بار بالا بود و پردازنده بیشتر وقتها بیکار، که ترکیب مشخص انتظار برای دیسک است، و دیسک وقتی درگیر میشود که حافظه تمام شده و سواپ شروع به کار کرده باشد.
خروجی سوم جواب را میدهد. dmesg -T | grep -i killed میگوید هسته حافظه را از کدام پروسه گرفته است، و سطری که برمیگرداند تاریخ و ساعت دارد و نام پروسه را داخل پرانتز مینویسد. روی این دستگاه سطر Out of memory: Killed process 2231 (postgres) هر روز حوالی ساعت شش تکرار شده بود. پایگاه داده مقصر نبود؛ مقصر یک گزارشگیر بود که هر بعدازظهر باز میماند و حافظهاش را پس نمیداد، و هسته وقتی جا کم آورد بزرگترین مصرفکننده را کشت، که پایگاه داده بود.
خروجی چهارم درباره سرویسهاست. systemctl is-active میگوید الان زنده است، و is-enabled میگوید دفعه بعد هم بالا میآید، و این دو با هم جواب میدهند نه جدا. سرویسی که دستی راهاندازی شده active است و enabled نیست، و اولین قطعی برق آن را برای همیشه میخواباند بیآنکه کسی متوجه شود چه چیزی عوض شده. برعکسش هم هست: سرویسی که enabled است و مدام failed میشود، در فهرست پروسهها هر بار که نگاه کنید حاضر است، چون هر دقیقه دوباره راهاندازی میشود. journalctl -u با نام همان سرویس، تنها جایی است که این را به شکل یک روایت زماندار میگوید.
سه رقم، و پوشهای که باز نمیشود
دسترسیها روی یونیکس فهرست نیستند، سه رقماند، و هر رقم یک جمع کوچک است: چهار خواندن، دو نوشتن، یک اجرا، جمعشده برای یک مخاطب، یعنی مالک، بعد گروه، بعد بقیه. روی یک پوشه بیت اجرا معنایش وارد شدن است نه اجرا کردن، و همینجاست که یک اشتباه رایج ساخته میشود: chmod 755 روی یک پوشه یعنی میشود واردش شد، و chmod 644 یعنی نمیشود. پوشهای با ۶۴۴ وجود دارد، در فهرست دیده میشود، و باز نمیشود، و برنامهای که سراغش رفته خطایی میدهد که شبیه خراب بودن خودش است.
این حالت اینجا بیشتر از جای دیگر پیش میآید، چون فایلها معمولا از یک حافظه USB یا یک اشتراک ویندوزی میآیند و آن دو دسترسی یونیکسی ندارند؛ هرچه از آنجا کپی شود دسترسیاش را از تنظیمات اتصال میگیرد، نه از فایل. جواب همیشه chmod -R 777 نیست، که رایجترین توصیه در فارسی است و یک پوشه قابل نوشتن برای همه میسازد؛ جواب دیدن مالک با ls -ld و درست کردن همان است.
سه سیستم، دو پرسش
چه چیزی میانشان منتقل میشود، و چه چیزی باید دوبار یاد گرفته شود
اینکه سیستم در خانواده یونیکس هست یا نه، و اینکه تکتک اداره میشود یا صدتایی. همین جفت تعیین میکند چقدر از یک کار به کار بعدی میرود.
تکتک اداره میشود
متمرکز اداره میشود
چیزی درباره بهتر بودن نمیگوید، و خانهای که کسی در آن کار میکند را بیشتر کارفرما انتخاب میکند تا خودش.
جایی که کار میایستد
ایست اینجا خط فرمان است، اما نه به دلیلی که در متنهای انگلیسی نوشته میشود. اولین دستوری که برای یک تازهکار ایرانی شکست میخورد خطای نحوی نیست، خطای شبکه است داخل مدیر بسته: sudo apt update به مهلت میرسد یا وسط کار میایستد، و هیچ آموزشی که دارد خوانده میشود یک سطر هم دربارهاش ندارد. نتیجهگیری طبیعی این است که کار خراب شده یا خودش اشتباه کرده، در حالی که فهرست مخزنها در /etc/apt/sources.list است و عوض کردن دامنهاش با یک آینه داخلی همان دستور را در چند ثانیه تمام میکند. یک ساعت اینجا تفاوت میان کسی است که چیزی که بیشتر سرورها اجرا میکنند را ادامه میدهد و کسی که برمیگردد.
ایست دوم روی ویندوز است و شکل دیگری دارد. نسخهای که مغازه نصب میکند تقریبا همیشه بهروزرسانی خاموش دارد، چون فعالسازی و خرید از فروشگاه مایکروسافت با کارت ایرانی انجام نمیشود؛ پس وصلهنشده ماندن اینجا یک غفلت نیست، پیشفرض است، و کسی که میزکاری که بیشتر سازمانها اجرا میکنند را اداره میکند باید بداند این تصمیم را خودش نگرفته و باید دوباره بگیرد.
چه چیزی امروز باز میشود
روی هر لینوکس یک دهه اخیر، systemd مدیر سرویس است و journalctl راه خواندن کاری که کرده. جای اسکریپتهای init و لاگهای پراکنده متنی را گرفت، که مستندات قدیمیتر از حدود ۲۰۱۵ هنوز همان را نشان میدهند و در فارسی سهم آن مستندات از نتایج جستوجو بیشتر هم هست. htop جای top را گرفت، رایگان و در مخزن هر توزیع است، و ستونهایش را به جای حفظ کردن میشود خواند؛ برای پیدا کردن همان گزارشگیرِ رهنما، مرتب کردن بر اساس حافظه یک کلید است. برای امتحان کردن سیستمی که مال شما نیست، ماشین مجازی رایگان است و برگشتپذیر، که همه استدلال اجرای یک سیستمعامل دیگر داخل همین یکی است. VirtualBox رایگان مانده و روی سختافزار اپل UTM همان نقش را دارد؛ هر دو جای نگه داشتن یک دستگاه دوم زیر میز را گرفتند، که همان ایستگاهی است که در ایران معمولا از قلم میافتد. همان جا هم اولین جایی است که رابطی که از کلیک کردن جلو میزند بدون هزینه تمرین میشود.
کدام سیستمعامل روی میز کسی است را تقریبا هیچوقت خودش انتخاب نمیکند: با شغل میآید، با سختافزار، یا با نرمافزاری که باید اجرا شود. مهارتی که میماند حرکت کردن میان آنهاست، و بیشترین بخشی که منتقل میشود ترمینال است، که میزکار یونیکسی، و اداره کردنش را برای کسی که از لینوکس میآید تقریبا آشنا میکند و برعکس. آنچه منتقل نمیشود دامنه و پالیسی است، که حرفهای جداست.
پرسشی که بعد از این میآید این است: وقتی خود دستگاه سالم است و هر چهار کار درست انجام میشود و باز هم کسی به سرویس نمیرسد، کدام لایه دروغ میگوید. رساندن داده از یک دستگاه به دستگاه دیگر جایی است که این پرسش ترتیب میگیرد، و اگر دستگاه چیزی باشد که باید شبانهروز جواب بدهد، ماشینهایی که به درخواستها جواب میدهند همین چهار کار را زیر بار دائم میگذارد. اگر هم خودِ دستگاه مشکوک باشد، خود دستگاه، و کار نگه داشتنش یک لایه پایینتر است.