اخیراً سعی داشتم برنامه ای را با استفاده از دستور apt برروی اوبونتو نصب کنم؛ که با خطای زیر برخورد کردم:

E: Could not get lock /var/lib/dpkg/lock – open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

در این مقاله می‌خواهیم به دلایل به وجود آمدن این مشکل و نحوه حل آن بپردازیم.

 

ممکن است شما به خطاهای مشابهی نیز برخورد کرده باشید؛ همانند:

E: Could not get lock /var/lib/apt/lists/lock – open (11: Resource temporarily unavailable)
E: Unable to lock directory /var/lib/apt/lists/
E: Could not get lock /var/lib/dpkg/lock – open (11: Resource temporarily unavailable)
E: Unable to lock the administration directory (/var/lib/dpkg/), is another process using it?

هر دوی این خطاها، بسیار شبیه به یک خطای رایج دیگر مربوط به اوبونتو می باشند:  Unable to lock directory /var/cache/apt/archives

و نکته جالب این است؛ که رفع این خطاها نیز مشابه هستند.

رفع خطای “Unable to lock the administration directory (/var/lib/dpkg/)”

روش ۱:

دلایل زیادی می تواند برای مشاهده این خطا وجود داشته باشد. اولین و واضح ترین دلیل این است که برخی از فرایندهای دیگر از ابزار مدیریت بسته APT (به عبارت دیگر دستور apt یا apt-get) استفاده می کنند. بنابراین، باید بررسی کنید آیا مرکز نرم افزار اوبونتو یا ابزار مدیریت بسته گرافیکی Synaptic در حال اجرا است یا خیر؛ شما همچنین می توانید، از خط فرمان لینوکس برای پیدا کردن و متوقف نمودن آن فرایند (پروسس) استفاده کنید. برای انجام این کار، از دستور زیر استفاده کنید:

ps aux | grep -i apt

این دستور، به شما شناسه فرایند(پروسس) اجرا کننده apt یا apt-get را نشان می دهد. در مثال زیر، شناسه فرآیند 7343 است. شما می توانید آخرین خط حاوی 'grep – colour = auto' را نادیده بگیرید.

شما می توانید از شناسه فرآیند(پروسس) برای متوقف کردن آن استفاده کنید: (به جای عبارت process id، شماره پروسس مورد نظر را قرار دهید.)

sudo kill -9 <process id>

به عنوان مثال، برای متوقف کردن پروسس "sudo apt update" در تصویر بالا، عبارت زیر را وارد می‌کنیم:

sudo kill -9 13290

راه دیگر و البته آسان تر، استفاده از دستور killall خواهد بود. این دستور، تمام برنامه های اجرا کننده را متوقف می نماید:

sudo killall apt apt-get

روش ۲:

روش اول در اکثر موارد مشکل را برای شما حل می کند. اما مسئله ی من کمی متفاوت بود. من، در حال بروزرسانی سیستم خود بودم که به طور تصادفی ترمینال را بستم. به همین دلیل، هیچ فرآیندی در حال اجرای apt نبود، اما باز هم این خطا را به من نشان داد.
در این مورد، علت اصلی فایل قفل است. پرونده های قفل برای جلوگیری از استفاده از داده های یکسان توسط دو یا چند فرآیند استفاده می شود. وقتی دستورات apt اجرا می شوند، آنها در برخی از مکان ها فایل های قفل ایجاد می کنند. اگر دستور apt قبلی به درستی خاتمه نیافته باشد، فایل های قفل حذف نشده و بنابراین از اجرای هرگونه از دستورات apt/apt-get جلوگیری می کنند و شما دیگر قادر نیستید دستور دیگری اجرا کنید.
برای حل کردن این مشکل، تنها کاری که باید انجام دهید، حذف فایل های قفل است. اما قبل از انجام این کار، بهتر است، هر فرآیندی که از فایل های قفل استفاده می کند را متوقف نمایید.
از دستور lsof برای دریافت شناسه فرایند دارنده ی فایل های قفل استفاده کنید. این دستورات را یک به یک اجرا کنید:

lsof /var/lib/dpkg/lock
lsof /var/lib/apt/lists/lock
lsof /var/cache/apt/archives/lock

این امکان وجود دارد که دستورات، هیچ خروجی ای برنگردانند، یا تنها یک شماره برگردانند. اگر آن ها حداقل یک عدد برگرداندند، از عدد(ها) استفاده کرده و بدین صورت فرآیندها را متوقف نمایید (PID را با شماره هایی که از دستورات فوق به دست آورده اید، جایگزین کنید):
 

sudo kill -9 PID

اکنون می توانید با استفاده از دستورات زیر، فایل های قفل را بصورت ایمن، حذف کنید:

sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock

پس از آن بسته ها را مجددا پیکربندی نمایید:

sudo dpkg --configure -a

حال اگر دستور به  sudo apt update را اجرا کنید، همه چیز باید درست باشد.

عیب یابی: “dpkg: error: dpkg frontend is locked by another process”

اگر هنگام اجرای روش شرح داده شده، خطای “dpkg frontend is locked by another process” را مشاهده کردید، باید یک مرحله اضافه تری را انجام دهید.
ابتدا، شناسه فرآیند دارنده ی فایل قفل را بیابید.

lsof /var/lib/dpkg/lock-frontend

دستور فوق، PID فرایندهای استفاده کننده از فایل های قفل را به شما می دهد. از این PID برای متوقف کردن فرآیند استفاده کنید.

sudo kill -9 PID

اکنون می توانید قفل را حذف کرده و dpkg را مجددا پیکربندی نمایید:

sudo rm /var/lib/dpkg/lock-frontend
sudo dpkg --configure -a

 

امیدواریم این مقاله به حل مشکل E: Could not get lock /var/lib/dpkg/lock در سیستم اوبونتوی شما کمک کرده باشد؛ مثل همیشه، اگر سوال، پیشنهاد، یا انتقادی دارید، خوشحال می‌شویم آنها را بشنویم.

 

منبع: این