Gönderen lsof
adam sayfası
Lsof, komut adlarının, dosya adlarının, Internet adreslerinin veya dosyalarının, oturum açma adlarının, NFS dosyalarının, PID'lerin, PGID'lerin veya listelemelerinin istendiği UID'lerin bulunmaması da dahil olmak üzere herhangi bir hata algılanırsa bir (1) döndürür. -V seçeneği belirtilirse, lsof listelenemediği arama öğelerini gösterir.
Bu, lsof failed for some other reason
cümlenizin asla infaz edilmeyeceğini düşündürür .
Harici işleminiz hala açıkken dosyayı taşımayı denediniz mi? Hedef dizin aynı dosya sisteminde ise, altta yatan inode aynı kalacağı için üçüncü bir işlemden orijinal yol altında bu dizine erişmeniz gerekmedikçe bunu yapmakta herhangi bir sorun olmamalıdır. Aksi takdirde mv
yine de başarısız olacağını düşünüyorum .
Harici işleminiz dosyayla bitene kadar beklemeniz gerekiyorsa, tekrar tekrar yoklama yerine engelleme yapan bir komut kullanmanız daha iyi olur. Linux'ta inotifywait
bunun için kullanabilirsiniz . Örneğin:
inotifywait -e close_write /path/to/file
Kullanmanız gerekiyorsa lsof
(belki taşınabilirlik için), şöyle bir şey deneyebilirsiniz:
until err_str=$(lsof /path/to/file 2>&1 >/dev/null); do
if [ -n "$err_str" ]; then
# lsof printed an error string, file may or may not be open
echo "lsof: $err_str" >&2
# tricky to decide what to do here, you may want to retry a number of times,
# but for this example just break
break
fi
# lsof returned 1 but didn't print an error string, assume the file is open
sleep 1
done
if [ -z "$err_str" ]; then
# file has been closed, move it
mv /path/to/file /destination/path
fi
Güncelleme
Aşağıdaki @JohnWHSmith tarafından belirtildiği gibi, en güvenli tasarım her zaman lsof
yukarıdaki gibi bir döngü kullanır , çünkü birden fazla işlemin dosya yazmak için açık olması mümkündür (örnek bir durum, dosyaları okuma ile açan kötü yazılmış bir dizin oluşturma arka plan programı olabilir) / gerçekten okunması gerektiğinde bayrak yaz). inotifywait
yine de uyku yerine kullanılabilir, sadece uyku hattını değiştirin inotifywait -e close /path/to/file
.