وبلاگ نت‌آرامآموزش، تجربه و راهکارهای زیرساخت

رفع خطای قفل apt و dpkg در اوبونتو؛ بدون حذف فایل lock

آموزش ساده پیدا کردن فرایند نگهدارنده قفل apt، بررسی به‌روزرسانی خودکار و بازیابی نصب نیمه‌تمام بدون پاک کردن فایل lock.

انتشار:
توسط تیم فنی نت‌آرام
۸ دقیقه زمان مطالعه
۰ دیدگاه
محتوای تخصصی، ساده و کاربردی
هماهنگ با هویت حرفه‌ای نت‌آرام
بازگشت به لیست مقالات
تصویر شاخص مقاله رفع خطای قفل apt و dpkg در اوبونتو؛ بدون حذف فایل lock در وبلاگ نت‌آرام
محتوای آموزشی وبلاگ نت‌آرام
می‌خواهید برنامه‌ای روی سرور Ubuntu یا Debian نصب کنید، اما پیام Could not get lock یا Unable to acquire the dpkg frontend lock می‌بینید. معمولاً این یعنی یک کار دیگر در همان لحظه مشغول مدیریت بسته‌هاست؛ برای مثال به‌روزرسانی خودکار هنوز تمام نشده یا شما دستور نصب دیگری را در یک نشست دیگر اجرا کرده‌اید.
این قفل برای جلوگیری از دستکاری هم‌زمان پایگاه بسته‌هاست. فایل lock را پاک نکنید. وجود خود فایل نشان نمی‌دهد که یک فرایند همین حالا قفل را نگه داشته است و حذف آن می‌تواند وضعیت بسته‌ها را خراب کند. در ادامه یاد می‌گیرید چه کسی قفل را گرفته، چه زمانی صبر کردن کافی است و اگر نصب قبلی واقعاً ناتمام مانده چه کنید. توضیح تیم dpkg دبیان نیز همین تفاوت فایل و قفل واقعی را شرح می‌دهد.

این راهنما برای کدام سیستم و کدام خطاست؟

روش زیر برای خانواده Ubuntu و Debian و مدیر بسته apt و dpkg است. AlmaLinux معمولاً از dnf و rpm استفاده می‌کند و دستورهای تعمیر آن یکسان نیست. اگر روی هاست اشتراکی دسترسی مدیریتی ندارید، متن خطا و زمان آن را به مدیر سرویس بدهید؛ نصب و تغییر بسته‌های سیستم‌عامل معمولاً در اختیار صاحب هاست نیست.
ابتدا کل پیام خطا را بخوانید. چند حالت مشابه، راه‌حل متفاوت دارند:
| پیام یا وضعیت | معنی احتمالی و مسیر بعدی | | --- | --- | | Could not get lock و نام یک فرایند یا PID | برنامه دیگری احتمالاً در حال استفاده از قفل است؛ آن را شناسایی کنید و اجازه دهید تمام شود. | | Permission denied یا are you root | ممکن است مجوز کافی نداشته باشید؛ حساب و مجوز sudo را بررسی کنید، نه اینکه فایل را حذف کنید. | | dpkg was interrupted | نصب قبلی ممکن است ناتمام مانده باشد؛ پس از اطمینان از نبودن کار فعال، مرحله بازیابی پایین را بخوانید. | | Temporary failure resolving یا خطای مخزن | مشکل می‌تواند DNS یا مخزن باشد و لزوماً با قفل ارتباط ندارد. |
اگر در پیام شماره‌ای بعد از process یا PID آمده، آن را یادداشت کنید. این شماره برای یک فرایند است و در سیستم شما با مثال‌های اینترنتی فرق دارد. نام فایل قفل هم مهم است؛ قفل فهرست بسته‌ها و قفل پایگاه dpkg همیشه یک چیز نیستند.

قدم اول: مطمئن شوید نصب دیگری را خودتان اجرا نکرده‌اید

اگر چند پنجره SSH یا چند مدیر دارید، ابتدا از آن‌ها بپرسید نصب یا به‌روزرسانی دیگری در حال انجام است یا نه. اگر همان کار هنوز در پنجره دیگری پیشرفت می‌کند، بگذارید پایان یابد. بعد از دیدن پایان کار، دستور موردنظر خود را فقط یک بار تکرار کنید.
بلافاصله بعد از روشن شدن سرور، Ubuntu ممکن است به‌روزرسانی خودکار را اجرا کند. در این حالت چند دقیقه صبر کردن و دیدن وضعیت معمولاً از مداخله امن‌تر است؛ مدت دقیق به تعداد بسته‌ها و شرایط سرور بستگی دارد. مستندات به‌روزرسانی خودکار Ubuntu توضیح می‌دهد چرا این کار گاهی نزدیک زمان راه‌اندازی سرور رخ می‌دهد.

قدم دوم: صاحب قفل را پیدا کنید

اگر در پیام خطا مثلاً PID برابر 1234 نوشته شده، در کنسول یا SSH همان سرور دستور زیر را اجرا کنید؛ 1234 را با عدد واقعی پیام خودتان جایگزین کنید:
کد / دستورps -p 1234 -o pid,ppid,etime,stat,args
این دستور شناسه فرایند، شناسه والد، مدت اجرا، وضعیت و فرمان را نشان می‌دهد. اگر نامی مثل apt، dpkg یا unattended-upgrade می‌بینید، ممکن است همان کار در حال اجرا باشد. اگر خروجی فقط عنوان ستون‌ها بود یا فرایند دیگری با آن شماره وجود داشت، احتمال دارد فرایند قبلی تمام شده و شماره دوباره استفاده شده باشد؛ بر اساس PID قدیمی هیچ فرایندی را متوقف نکنید.
برای دیدن فرایندهایی که اکنون با فایل‌های قفل مشخص کار می‌کنند، اگر ابزار fuser روی سیستم نصب است، از این دستور فقط برای مشاهده استفاده کنید:
کد / دستورsudo fuser -v /var/lib/dpkg/lock-frontend /var/lib/dpkg/lock /var/lib/apt/lists/lock /var/cache/apt/archives/lock
این دستور فایل‌ها را حذف نمی‌کند. خروجی می‌تواند نام فرایند و PID را نشان دهد. خالی بودن خروجی یا خطای فایل پیدا نشد باید با متن کامل پیام، زمان اجرای دستور و نام مسیر واقعی بررسی شود؛ ممکن است ابزار نصب نباشد، قفل دیگری مطرح باشد یا وضعیت بین دو آزمایش تغییر کرده باشد. اگر fuser در دسترس نیست، روی سرور کاری برای نصب آن در حالی که مدیریت بسته‌ها قفل است تلاش نکنید؛ همان PID پیام و وضعیت سرویس‌ها را بررسی کنید.

قدم سوم: فعالیت به‌روزرسانی خودکار را بررسی کنید

در بسیاری از نصب‌های Ubuntu سرویس‌های زمان‌بندی‌شده apt وجود دارند. برای مشاهده وضعیت آن‌ها:
کد / دستورsystemctl status apt-daily.service apt-daily-upgrade.service --no-pager
اگر یکی از واحدها در حال اجراست، جزئیات آن و زمان آخرین فعالیت را ببینید و فرصت دهید کارش تمام شود. نام واحدها یا فعال بودن آن‌ها در تمام نصب‌های Debian و Ubuntu یکسان نیست. نبود یک واحد به معنی نبود هر فرایند دیگر نیست؛ خروجی PID و قفل واقعی را هم تطبیق دهید.
برای دیدن گزارش سرویس به‌روزرسانی، اگر همان واحد روی سیستم شما وجود دارد، می‌توانید از دستور زیر استفاده کنید:
کد / دستورjournalctl -u apt-daily-upgrade.service -b -n 50 --no-pager
این دستور آخرین ۵۰ ردیف مربوط به آن واحد در بوت فعلی را نشان می‌دهد. پیشرفت نصب، خطای شبکه یا انتظار برای یک عملیات دیگر ممکن است در گزارش دیده شود. خروجی را با زمان فعلی مقایسه کنید؛ قدیمی بودن یک ردیف به‌تنهایی ثابت نمی‌کند فرایند قفل شده است. گزارش ممکن است نام بسته یا اطلاعات سرور را داشته باشد؛ قبل از ارسال آن را بررسی کنید.

اگر کار طولانی شده و ظاهراً پیش نمی‌رود

روی سرور فعال، ابتدا برنامه بازگشت و دسترسی کنسول خارج از SSH را فراهم کنید. مصرف دیسک، پیام خطا و وضعیت فرایند و سرویس را همراه با مدیر سرور بررسی کنید. یک به‌روزرسانی بزرگ یا کند می‌تواند زمان‌بر باشد؛ خاموش کردن سرور، بستن ناگهانی همه فرایندها یا اجرای هم‌زمان چند دستور نصب می‌تواند وضعیت را بدتر کند.
اگر صاحب فرایند تأیید کرد کار واقعاً متوقف شده و نمی‌تواند از راه عادی خارج شود، در زمان مناسب و پس از اطمینان از هویت فرایند می‌توان درخواست پایان محترمانه به همان فرایند مشخص داد. این کار یک اقدام مدیریتی است، نه قدم معمول برای هر خطای قفل. برای نمونه، فقط وقتی PID واقعی و متعلق بودن آن تأیید شده است:
کد / دستورsudo kill -TERM 1234
عدد را با PID تأییدشده جایگزین کنید؛ PID مثال را عیناً اجرا نکنید. سیگنال TERM درخواست پایان است و تضمین نمی‌کند کار فوراً تمام شود. دوباره با ps و fuser وضعیت را ببینید. اگر فرایند بخشی از سرویس مدیریت‌شده یا زنجیره‌ای از چند فرایند است، روش توقف سازگار با همان سرویس را با مدیر بررسی کنید؛ به سراغ قتل گروهی فرایندها، KILL یا حذف فایل قفل نروید.

اگر نصب قبلی نیمه‌تمام مانده است

فقط پس از اینکه مطمئن شدید هیچ نصب یا به‌روزرسانی دیگری در حال اجرا نیست و قفل مربوط آزاد شده، روی سرور خود با دسترسی مدیر دستور زیر را اجرا کنید:
کد / دستورsudo dpkg --configure -a
این دستور تلاش می‌کند بسته‌هایی را که باز شده‌اند اما پیکربندی‌شان ناتمام مانده تکمیل کند. ممکن است اسکریپت بسته‌ها را اجرا کند یا درخواست ورودی نشان دهد؛ روی سرور حساس با آگاهی از بسته‌های در حال تغییر و در زمان مناسب اجرا شود. اگر خطا داد، نام بسته و متن کامل خطا را نگه دارید؛ دستور را پشت سر هم تکرار نکنید و فایل‌های پایگاه dpkg را دستی ویرایش نکنید.
پس از پایان بدون خطا، سلامت وابستگی‌ها را بررسی کنید:
کد / دستورsudo apt-get check
اگر اعلام کرد وابستگی‌ها مشکل دارند، تعمیر می‌تواند نصب، تغییر یا حذف بسته‌هایی را پیشنهاد کند. ابتدا طرح پیشنهادی را بدون اعمال ببینید:
کد / دستورsudo apt-get -s -f install
گزینه s در این نمونه شبیه‌سازی می‌کند و f درخواست بررسی راه اصلاح وابستگی‌های خراب است. فهرست نصب و حذف پیشنهادی را با مدیر سرویس بخوانید؛ شبیه‌سازی تضمین نمی‌کند وضعیت در زمان اجرای واقعی بدون تغییر بماند. اگر قرار است بسته حیاتی حذف شود یا دلیل خطا روشن نیست، دستور واقعی را اجرا نکنید تا راه مناسب همان سیستم مشخص شود.

چطور مطمئن شویم مشکل برطرف شده است؟

وقتی کار قبلی پایان یافت یا بازیابی با موفقیت تمام شد، همان دستور اولیه‌ای را که با خطای قفل روبه‌رو شده بود فقط یک بار دوباره اجرا کنید. اگر دیگر پیام قفل نمی‌آید، به خروجی کامل عملیات جدید هم نگاه کنید: ممکن است بعد از رفع قفل با خطای مستقلی مثل مشکل DNS یا مخزن روبه‌رو شوید. پایان خطای قفل به معنی نصب موفق تمام بسته‌ها نیست.
اگر خطا تکرار می‌شود، زمان، متن دقیق، خروجی مشاهده PID و وضعیت سرویس مربوط را برای مدیر سرور آماده کنید. فایل‌های lock را همچنان نگه دارید؛ آزاد شدن قفل به پایان فرایند وابسته است، نه حذف نام فایل. برای انتخاب سرویس با دسترسی و منابع مستقل، صفحه سرور مجازی ایران نت‌آرام را می‌توانید ببینید.
اشتراک‌گذاری:
لینکدینتلگرامایکس

دیدگاه‌ها (۰)

دیدگاه‌های تاییدشده و پاسخ‌های تیم نت‌آرام