Linux'ta hangi işlemin bir dosyanın açık olduğunu nasıl belirleyebilirim?


124

Hangi sürecin bir kilit dosyası sahibi olduğunu belirlemek istiyorum. Kilit dosyaları, yalnızca oluşturulmuş belirli bir ada sahip bir dosyadır.

Öyleyse, Linux'ta hangi sürecin açık bir işlemi olduğunu nasıl belirleyebilirim? Tercihen bir liner tipi veya belirli bir Linux araç çözümü en uygunudur.

Yanıtlar:


55

Bunun için de kullanabilirsiniz fuser:

~> less .vimrc
# put in background
~> fuser .vimrc
.vimrc:              28135
~> ps 28135
  PID TTY      STAT   TIME COMMAND
28135 pts/36   T      0:00 less .vimrc

Bu harikaydı, ancak bir komut dosyasında kullanmak için çıktı uzunluğunu kontrol etmek zorunda kaldım.
Chovy

çıkış uzunluğu ne demek?
Nathan Fellman

if [ kaynaştırıcı "$ file" `]; sonra çıkış `
Chovy

1
Isıtıcı çıkış kodları ile garip davranışa sahip. iki durumlu 1 çıkış kodu döndürür: A / bazı dahili hata, kontrol edilen dosya bulunamadı vb, B / hiçbir işlem belirtilen dosyayı açmamış. Durumda A / bazı hata mesajı çıktılarına yazdırılır. Ne yazık ki, dosya kullanılabilir olduğunda ve bir şey tarafından açıldığında, çıktı üretilir ancak çıkış kodu 0 ile üretilir. lsoft biraz daha kötü bir çözüm çünkü bu daha yavaş çalışıyor.
Znik

Bu esasen takip eden aynıdır ls- bir hata varsa (ör. Geçersiz seçenek belirtilmişse) veya dosya bulunamadığında (ve başarıyla bilgi bildirirse 0 ) çıkış kodunu 2 döndürür .
Scott,

144

Çoğu Linux sisteminde lsof NAMEbu işi yapar:

fin@r2d2:~$ lsof /home/fin
COMMAND   PID USER   FD   TYPE DEVICE SIZE    NODE NAME
bash    21310  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21320  fin  cwd    DIR    8,1 4096 5054467 /home/fin
lsof    21321  fin  cwd    DIR    8,1 4096 5054467 /home/fin
fin@r2d2:~$

4
Ve eğer sende yoksa?
JoseLSegura

3
@JoseLSegura: Sizin için yararsız olması için 'sonra lsof'u kurun' cevabı için yeterince becerikli olduğunu farz ediyorum. Sorunu çözebilir misin? Kökün yoksa, muhtemelen başka bir kullanıcının dosyayı açıp açmadığını öğrenmek için ayrıcalıkların yoktur.
Michael Scheper,

Bu sadece dosyalar için değil, dosyalar için işe görünmüyor
Jason

@Jason: dosyalar için çalışır, ancak cwdsatırlar (bir işlemin geçerli çalışma dizini olduğunu bildiren satırlar) yalnızca dizinleri bildirir.
reinierpost

9

Bir dosyanın açık olması bir kilit değildir, çünkü her işlem ilk önce dosyanın açık olup olmadığını kontrol etmek zorundaysa ve eğer öyleyse devam etmiyorsa veya açmıyorsa / açıyorsa, iki işlem aynı anda oldukça iyi kontrol edebilir açık olmadığını, sonra onu hem oluşturun hem de açın.

Bir dosyayı kilit olarak kullanmak için, kontrol et ve kilitle işlemi tek bir kesintisiz işlem olmalıdır. Bunu, Unix dosya sisteminde salt okunur modda bir dosya oluşturarak ve kilidini açmak için kaldırarak başarabilirsiniz. Dosya varsa (ve yalnızca okunursa) dosya oluşturma işlemi başarısız olur, bu nedenle tek bir atomik işlemde onayla ve kilitle elde edersiniz.

Kilitleme işleminiz bir arka plan programı olarak çalışacak bir kabuk betiği ise, bu efekti kullanarak umaskyeni dosyaların oluşturulduğu izinleri ayarlayan işlem başına bir ayar kullanarak :

oldumask = $ (umask'ı)
umask 222 # sahibine de istenmeyen dosyalar yaratır
yankı varsa $$> / var / lock / foo
sonra
    : kilitleme başarılı
Başka
    : kilitleme başarısız oldu
fi
umask $ oldumask
Bu aynı zamanda sahip olma işlemini 'PID'yi dosyaya yazar ve bu da diğer sorununuzu çözer: cat /var/lock/foo
“Hangi dosyalarda hangi işlemler açık?” Sorusu ile ilgili olarak, bu, bir dosya sistemini kaldırmak istediğinizde ancak bazı işlemlerin içinde açık bir dosya bulunduğundan, kullanışlıdır. Bu komutları kullanabiliyorsanız, /procroot olarak sorabilirsiniz :

ls -l /proc/*/cwd | grep '/var/lock/foo$'

veya ölümlü bir kullanıcı olarak:

ls -l /proc/*/cwd 2>/dev/null | grep '/var/lock/foo$'


`ls -l 'yöntemi Linux için çalışıyor ancak CygWin için çalışmıyor gibi görünüyor: orada dosya kilitleme hakkında bilgi yok. Nasıl çözüleceğini bilmiyor musun? Teşekkürler.
Sopalajo de Arrierez,

Hayır, bir kilit için salt okunur dosya oluşturmazsınız, çünkü uygulamanız kilitlendiğinde dosya hala orada olacaktır. Kullanıcı çöktü app sonra zihni temizlemek için zorlamak.
polkovnikov.ph 13:18

6

Tam olarak hangi işlemin dosya tanımlayıcısının dosyanıza bağlandığını bilmek istiyorsanız lsofveya fuser- ile arama yapın /proc:

$ find /proc -regex '\/proc\/[0-9]+\/fd\/.*' -type l -lname "*$1*" -printf "%p -> %l\n" 2> /dev/null

$1Aradığınız açık dosya adı ile değiştirin . -printfGörmek istediğiniz şeyi değiştirebilir veya bu işlemin bilgileriyle egrep -o '[0-9]+' | head -1kullanmak için boruya ekleyebilirsiniz .ps -Fp <pid>

@Fin tarafından verilen cevap en iyi cevaptır, açıkçası, ancak @ JoseLSegura'nın yorumuna cevap vermek , eğer bu mümkün değilse yukarıdaki çözüm benim cevabımdı .$ lsof <filename>


2

Kabul edilen cevabı kullanmanın dizimi kullanan işlemleri listelemediğini buldum (ubuntu 14.04).

Sonunda, lsof (açık dosyaları listele) kullandım ve rahatsız edici işlemi bulmak için çıktısını elimden aldım:

lsof | egrep "<regexp-for-your-file>"

Bu kullanım için daha temiz ve daha hızlı bir yöntem lsofseçeneğidir -R. örneğin: lsof -R [filename]
tron5
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.