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 umask
yeni 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,
/proc
root 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$'