생성 또는 사용중인 파일을 체크후에 복사

keuyeon의 이미지

자바에서 특정 디렉토리에 파일을 생성해 내용을 쓰고나면
주기적으로 해당 디렉토리에 있는 파일들을 다른 경로로 복사 또는 이동을 시키려고 합니다.

그런데 문제는 파일이 생성중이거나 쓰고 있을 때 파일이 복사가 되면 내용이 없는 빈 파일이 복사가 되지 않을까 싶어서
현재 이 파일이 생성중건지 또는 쓰고있는지를 쉘 스크립트에서 체크를 하고 싶습니다.

구글링을 해보니 아래 리눅스포럼에서 lsof 라는 유틸을 아래처럼 사용한 케이스가 있더라구요.
http://www.linuxforums.org/forum/programming-scripting/64925-how-check-if-file-being-read.html

FILE_NAME="music.mp3"
FILE_OPEN=`lsof | grep $FILE_NAME`

if [ -z $FILE_OPEN ]
then
echo "File NOT open"
else
echo "File Open"
fi

그래서 lsof 를 이용해볼까 했는데 여기 환경이 lsof가 없는 리눅스네요. -_-;;

혹시 생성중이거나 사용중인 파일을 체크하고 문제없이 복사할 수 있는 다른 방법이 있는지 알고 싶습니다.
꼭 쉘이 아니더라도요.

익명 사용자의 이미지

lsof homepage에서 내려받을 수 있는 데요.
http://people.freebsd.org/~abe/

keuyeon의 이미지

임의로 'lsof' 를 설치할 수가 없어서 다른 방법을 찾아야 할듯 합니다.
아~ 딱히 꼼수도 생각아나고 답답하네요. ㅡㅜ

'Dante once said that the hottest places in hell are reserved for those who in a period of moral crisis maintain their neutrality' -J.F Kennedy, 1963

wariua의 이미지

리눅스에서 lsof 프로그램의 기본 동작은 /proc/PID/ 디렉터리 안의 하부 디렉터리들을 뒤지며 정보를 수집한 다음 적절히 가공해서 출력하는 것입니다.

정해진 어떤 프로그램이 특정 파일을 열고 있는지 여부를 확인하고 싶으시다면... 1) 그 프로세스의 pid를 구한 다음 2) /proc/???/fd 디렉터리 안에 ("???" 위치에 pid) 그 파일로의 심볼릭 링크가 있는지 확인해 보시면 됩니다. 단, 파일을 만드는 프로그램과 확인하는 셸 스크립트의 사용자 ID가 다르다면 접근 권한 문제가 발생할 수 있습니다.

한편 이런 문제(쓰기가 완료되지 않은 파일에 대한 접근을 방지하는 문제)에 많이들 쓰는 해결책은 1) 임시 파일명으로 파일 쓰기를 한 다음 2) 쓰기가 끝나면 임시 파일명을 정식 파일명으로 바꿔주는 방법입니다. 그런 방법을 쓰기는 어려운 조건인가 봅니다?

$PWD `date`

keuyeon의 이미지

임시파일에서 정식파일로 바꾸는 방법 고려해 보겠습니다.
조언 감사드립니다.

'Dante once said that the hottest places in hell are reserved for those who in a period of moral crisis maintain their neutrality' -J.F Kennedy, 1963

M.W.Park의 이미지

http://oss.sgi.com/projects/fam/ 이런것도 한번 고려해보시죠.

-----
오늘 의 취미는 끝없는, 끝없는 인내다. 1973 法頂

keuyeon의 이미지

overview 설명만 봐선 뭔지 잘 모르겠네요. -_-a

'Dante once said that the hottest places in hell are reserved for those who in a period of moral crisis maintain their neutrality' -J.F Kennedy, 1963

익명_사용자의 이미지

왜 fuser를 안쓰시나요?

Quote:

NAME
fuser - identify processes using files or sockets
.
DESCRIPTION
fuser displays the PIDs of processes using the specified files or file systems.

그냥 fuser file_path
를 입력하시면

해당 파일을 현재 소유하고 있는( 즉, 실행을 시키고 있던, 입/출력용으로 열고 있던... )
모든 프로세스들을 출력합니다.

lsof가 없는 시스템들은 가끔 존재해도
fuser가 존재하지 않는 시스템은 거의 없습니다.

한번 확인해보세요.

keuyeon의 이미지

이 시스템이 그렇네요.
fuser 두 없어요. 아오~ -_-a

여튼 좋은 정보 고맙습니다.

'Dante once said that the hottest places in hell are reserved for those who in a period of moral crisis maintain their neutrality' -J.F Kennedy, 1963

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.