adsense_in_article_test


리눅스에서 네트워크로 연결된(nfs/sshfs) 파일을 USB저장장치로 보낼 때의 문제 리눅스

NFS 또는 SSHFS처럼 네트워크를 통해 연결된 파일 시스템에서 USB저장장치(HDD/SSD)로 파일을 복사할 때 중간에 멈춰버리는 현상이 발생했다. 그냥 파일 한두개 정도 가져올 때는 별 문제가 없는 것 같은데, 1GB 가까이 되는 대용량의 파일을 수십개 복사해야 하는 상황에서 문제가 발생.

NFS/SSHFS에서 USB저장장치로 곧바로 옮길 경우, 잘은 모르겠지만 뭔가 중간에 서로 꼬이는 부분이 생길 수도 있는 모양이다. USB 인터페이스쪽으로 데이터를 제때 넘겨주지 못하면서 문제가 발생하는 것이 아닐까 싶긴 한데, 원인 파악보다 파일 복사가 더 급한 관계로 shell script 하나를 만들어서 해결.

복사할 파일을 램(RAM)디스크 영역인 /dev/shm 디렉토리로 하니씩 옮긴 후에 USB저장장치로 보내도록 했다. 아래와 같은 형태로 스크립트를 만들었다.

# 복사할 파일이 있는 디렉토리(src_dir)
src_dir="/nfs/my_files"
# 파일을 저장할 디렉토리(dst_dir)
dst_dir="/media/usb_storage"
# 램디스크의 임시 디렉토리(tmp_dir) 생성. mktemp 명령은 이전 게시물 참조. 여기로
tmp_dir=`mktemp -d /dev/shm/mydir_XXXX`
# 파일 복사 시작, .dat 파일만 복사
for file in `find $src_dir -type f | grep "\.dat$"`
do

  # 임시 디렉토리로 파일 복사
  cp $file $tmp_dir
  # usb저장장치로 파일 이동
  mv $tmp_dir/*.dat $dst_dir
done
# 임시 디렉토리 삭제
rm -r $tmp_dir

for 반복문으로 .dat 파일을 하나씩 처리했다. 램디스크에 만든 임시 디렉토리로 파일을 복사(cp)한 후에 이것을 usb저장장치로 이동(mv)했다.

임시 디렉토리에는 파일이 하나뿐이므로 이동할 때 굳이 파일명을 지정하지 않고 전체 파일(*.dat)을 다 이동시키도록 했다. 만약 스크립트에 다른 작업이 포함되어 있어서 임시 디렉토리에 다른 파일들이 혼재할 수도 있다면 아래와 같이 파일명을 찾아서 명시적으로 지정해 주어야 할 것이다. 이 경우 for 반복문이 아래와 같이 변경되어야 한다.

for file in `find $src_dir -type f | grep "\.dat$"`
do

  # 임시 디렉토리로 파일 복사
  cp $file $tmp_dir
  # 파일명 파악
  filename=`echo $file | rev | cut -d'/' -f1 | rev`
  # usb저장장치로 파일 이동
  mv $tmp_dir/$filename $dst_dir
done

위의 스크립트에서 file 변수의 값이 /nfs/my_files/data.dat 이런식이 될 것이므로 여기서 맨 마지막 '/' 다음에 있는 문자열이 파일명이다. echo 명령으로 출력한 것을 rev 명령으로 문자 순서를 반대로 정렬한 후에 cut 명령에서 구분자 '/' 기준으로(-d'/') 첫번째 항목(-f1)을 가져온다. 그리고 다시 정렬을 반대로 하면(rev) 파일명을 얻을 수 있다.

참고로, 위의 예시와 같이 find 명령을 사용할 경우 src_dir 디렉토리와 그 하위 디렉토리에 있는 파일이 모두 복사된다. 만약 하위 디렉토리 안에 있는 파일은 제외하려면 -maxdepth 옵션이 추가되어야 한다. 관련 내용은 이전 게시물을 참고하자. 여기로



덧글

댓글 입력 영역
* 비로그인 덧글의 IP 전체보기를 설정한 이글루입니다.


B-Side


adsense(w160_h600)2

통계 위젯 (화이트)

91848
5116
2103305

2019 대표이글루_IT

Google Analytics