로부터 lsof
man 페이지
Lsof는 명령 이름, 파일 이름, 인터넷 주소 또는 파일, 로그인 이름, NFS 파일, PID, PGID 또는 UID를 나열하도록 요청하지 않은 등 오류가 발견되면 1을 반환합니다. -V 옵션이 지정되면 lsof는 나열하지 못한 검색 항목을 나타냅니다.
따라서 lsof failed for some other reason
절이 실행되지 않을 것을 제안합니다 .
외부 프로세스가 여전히 열려있는 동안 파일을 이동하려고 했습니까? 대상 디렉토리가 동일한 파일 시스템에있는 경우, 기본 inode가 동일하게 유지되므로 세 번째 프로세스에서 원래 경로로 디렉토리에 액세스 할 필요가 없으면이를 수행하는 데 아무런 문제가 없습니다. 그렇지 않으면 mv
어쨌든 실패 할 것이라고 생각 합니다.
파일에서 외부 프로세스가 완료 될 때까지 기다려야하는 경우 반복적으로 폴링하는 대신 차단하는 명령을 사용하는 것이 좋습니다. Linux에서는이를 사용할 수 있습니다 inotifywait
. 예 :
inotifywait -e close_write /path/to/file
lsof
(이동성을 위해) 사용해야 할 경우 다음과 같이 시도 할 수 있습니다.
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
최신 정보
아래 @JohnWHSmith에서 언급했듯이 , 가장 안전한 디자인은 lsof
둘 이상의 프로세스가 쓰기 위해 파일을 열 수 있기 때문에 항상 위와 같은 루프를 사용합니다 (예를 들어 읽기로 파일을 여는 색인 작성 데몬이 잘못 될 수 있음) 실제로 읽기 전용이어야 할 경우 / write 플래그). inotifywait
그래도 수면 대신 사용할 수 있습니다 inotifywait -e close /path/to/file
. 수면 라인을로 교체하십시오 .