Bagaimana cara mengidentifikasi proses mengunci file?

35

Saya ingin tahu proses persisnya yang menggunakan file kunci. Saya tidak ingin memperbaikinya , tetapi hanya untuk mengetahui apa yang dilakukan sistem saya. Bagaimana saya bisa mengetahuinya?

Misalnya, pesan ini:

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?

Sekali lagi, saya hanya ingin mengidentifikasi proses menggunakannya, bukan bagaimana cara memperbaikinya.

Braiam
sumber

Jawaban:

38

Ada yang terkenal lsof:

sudo lsof /var/lib/dpkg/lock
COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
aptitude 4974 root    3uW  REG   8,23        0 815673 /var/lib/dpkg/lock

Dalam hal ini aptitude menggunakan file. Anda harus menggunakan root jika Anda tidak yakin pengguna mana yang mengunci file. Ini berguna untuk banyak hal juga, sayangnya itu tidak diinstal dengan Ubuntu, jadi Anda harus menginstalnya terlebih dahulu.

Untuk sisa manusia, ada fuserperintahnya. Ini aneh karena hanya mengembalikan PID alih-alih nama proses:

➜  ~  sudo fuser /var/lib/dpkg/lock
/var/lib/dpkg/lock:   4974

Di sini dikatakan bahwa file dan PID, yaitu 4974, jadi kita harus menyelidiki siapa:

➜  ~  ps 4974
  PID TTY      STAT   TIME COMMAND
 4974 pts/1    Sl+    0:06 aptitude
Braiam
sumber
6
Mengapa itu lsofterkenal? Apakah ada masalah dengannya?
Ruslan
3
@Ruslan Ya, ini memungkinkan pengguna yang tidak mengerti tahu penggunaan sebenarnya dari sistem yang bertentangan dengan apa yang sysadmin inginkan ...
Braiam
@Braiam Terlalu banyak informasi bisa menjadi hal yang berbahaya, di tangan kanan? ^ -_- ^
Peter David Carter
Opsi kedua dalam satu baris:ps $(sudo fuser /var/lib/dpkg/lock)
wjandrea
8

Kunci adalah cara sederhana untuk melakukan itu.

lslocks |grep /var/lib/dpkg/lock

Untuk menggunakan shell untuk menangani proses id:

for pid in `lslocks -rn | grep /var/lib/dpkg/lock|awk '{print $2}'`;
do 
    echo $pid; 
done
Jolestar
sumber
Iya nih. lslocksadalah cara terbaik untuk melakukannya. Menggunakan lsofmemberi saya kesalahan ini: "lsof: PERINGATAN: tidak dapat stat () fuse.gvfsd-fuse sistem file / run / user / 1000 / gvfs Informasi keluaran mungkin tidak lengkap"
Nav
@Nav itu bukan kesalahan, tapi PERINGATAN.
Braiam