25G가 넘는 거대한 설치 가능 디렉터리를 반복적으로 복사하려고 하며 소유자 및 그룹 ID, 권한 모드 등을 보존하고 싶습니다.
그래서 다음 명령을 실행했습니다.
bash-3.2$ date; cp -rpP /source/path/Oracle /target/path/Oracle;date;
Tue Jun 4 09:44:54 EDT 2013
...
몇 가지 관찰 사항:
오늘(2013년 6월 5일 수요일 12:09:25 EDT) 아직 완료되지 않았으며 어딘가에 멈춰 있는 것 같습니다. 프로세스를 분석하기 시작했는데 잠자고 있는 것 같습니다.
bash-3.2$ truss -p 09431; read(10, 0xFFBEF288, 32768) (sleeping...)
마지막 항목에도 잠자는 모습이 나와 있습니다.
bash-3.2$ pflags 09431 9431: cp -rpP /source/path/Oracle /target/path/Oracle data model = _ILP32 flags = RLC|ASYNC|MSACCT|MSFORK flttrace = 0xfffffbff sigtrace = 0xfffffeff 0xffffffff HUP|INT|QUIT|ILL|TRAP|ABRT|EMT|FPE|BUS|SEGV|SYS|PIPE|ALRM|TERM|USR1|USR2|CLD|PWR|WINCH|URG|POLL|STOP|TSTP|CONT|TTIN|TTOU|VTALRM|PROF|XCPU|XFSZ|WAITING|LWP|FREEZE|THAW|CANCEL|LOST|XRES|JVM1|JVM2|RTMIN|RTMIN+1|RTMIN+2|RTMIN+3|RTMAX-3|RTMAX-2|RTMAX-1|RTMAX entryset = 0x00000401 0x04000000 0x00000000 0x00000028 0x80000000 0x00000000 0x00000000 0x00000000 exitset = 0xfffffffe 0xffffffff 0xffffffff 0xffffffd7 0x7fffffff 0xffffffff 0xffffffff 0xffffffff /1: flags = ASLEEP read(0xa,0xffbef288,0x8000)
마침내 그것을 시도했다
pfiles
bash-3.2$ pfiles -F 09431 9431: cp -rpP /source/path/Oracle /target/path/Oracle Current rlimit: 256 file descriptors 0: S_IFCHR mode:0620 dev:363,0 ino:12582922 uid:502012187 gid:7 rdev:24,3 O_RDWR|O_NOCTTY|O_LARGEFILE /devices/pseudo/pts@0:3 1: S_IFCHR mode:0620 dev:363,0 ino:12582922 uid:502012187 gid:7 rdev:24,3 O_RDWR|O_NOCTTY|O_LARGEFILE /devices/pseudo/pts@0:3 2: S_IFCHR mode:0620 dev:363,0 ino:12582922 uid:502012187 gid:7 rdev:24,3 O_RDWR|O_NOCTTY|O_LARGEFILE /devices/pseudo/pts@0:3 3: S_IFDIR mode:0750 dev:377,1 ino:1135681 uid:502012187 gid:502012187 size:4096 O_RDONLY|O_NDELAY|O_LARGEFILE FD_CLOEXEC /source/path/Oracle 4: S_IFDIR mode:0750 dev:377,1 ino:1135682 uid:502012187 gid:502012187 size:4096 O_RDONLY|O_NDELAY|O_LARGEFILE FD_CLOEXEC /source/path/Oracle/Middleware 5: S_IFDIR mode:0750 dev:377,1 ino:14640507 uid:502012187 gid:502012187 size:4096 O_RDONLY|O_NDELAY|O_LARGEFILE FD_CLOEXEC /source/path/Oracle/Middleware/user_projects 6: S_IFDIR mode:0750 dev:377,1 ino:14640508 uid:502012187 gid:502012187 size:4096 O_RDONLY|O_NDELAY|O_LARGEFILE FD_CLOEXEC /source/path/Oracle/Middleware/user_projects/epmsystem2 7: S_IFDIR mode:0750 dev:377,1 ino:6480147 uid:502012187 gid:502012187 size:4096 O_RDONLY|O_NDELAY|O_LARGEFILE FD_CLOEXEC /source/path/Oracle/Middleware/user_projects/epmsystem2/EssbaseServer 8: S_IFDIR mode:0750 dev:377,1 ino:6480149 uid:502012187 gid:502012187 size:4096 O_RDONLY|O_NDELAY|O_LARGEFILE FD_CLOEXEC /source/path/Oracle/Middleware/user_projects/epmsystem2/EssbaseServer/essbaseserver1 9: S_IFDIR mode:0750 dev:377,1 ino:6480151 uid:502012187 gid:502012187 size:4096 O_RDONLY|O_NDELAY|O_LARGEFILE FD_CLOEXEC /source/path/Oracle/Middleware/user_projects/epmsystem2/EssbaseServer/essbaseserver1/bin 10: S_IFIFO mode:0660 dev:377,1 ino:9088704 uid:502012187 gid:502012187 size:0 O_RDONLY|O_LARGEFILE /source/path/Oracle/Middleware/user_projects/epmsystem2/EssbaseServer/essbaseserver1/bin/ESSBASE1_1 11: S_IFREG mode:0660 dev:326,22000 ino:128325 uid:502012187 gid:502012187 size:0 O_WRONLY|O_CREAT|O_TRUNC|O_LARGEFILE /target/path/Oracle/Middleware/user_projects/epmsystem2/EssbaseServer/essbaseserver1/bin/ESSBASE1_1
고쳐 쓰다: 위의 cp
프로세스가 종료되었습니다. 따라서 다음 관찰을 통해 문제를 재현하려고 시도합니다.
문서금지:
bash-3.2$ ls -l ESSBASE1_1 prw-rw---- 1 kent kent 0 Nov 22 2011 ESSBASE1_1
이 파일을 개별적으로 cp하려고 하면 다음과 같습니다.
bash-3.2$ cp ESSBASE1_1 ESSBASE1_1kent # PID = 08745 ...
그것도 걸려있습니다.
pflags
자고 있는 것 같습니다 .bash-3.2$ pflags 08745 8745: cp ESSBASE1_1 ESSBASE1_1kent data model = _ILP32 flags = MSACCT|MSFORK /1: flags = ASLEEP read(0x3,0xffbf6bc8,0x8000)
파일을 사용하여 다른 모든 프로세스 검색
bash-3.2$ fuser -f /source/path/Oracle/Middleware/user_projects/epmsystem2/EssbaseServer/essbaseserver1/bin/ESSBASE1_1 /source/path/Oracle/Middleware/user_projects/epmsystem2/EssbaseServer/essbaseserver1/bin/ESSBASE1_1: 8745o 25057o
"o"는 프로세스가 파일을 열린 파일로 사용하고 있음을 나타냅니다.
찾기 진행 중:
bash-3.2$ pstree | grep 8745 | | | |--- 09695 kent grep 8745 | | \--- 08745 kent cp ESSBASE1_1 ESSBASE1_1kent bash-3.2$ pstree | grep 25057 | | | \--- 09700 kent grep 25057 | | |-+- 25057 kent 86:43 /some/path/Oracle/Middlewa
PID가 25057인 프로세스는 서버 프로세스입니다.
열린 파일은 마운트 지점에 있습니다. NAS 디스크입니다.
bash-3.2$ cat /etc/mnttab | grep apps server1.com:/vol/server1_nec_nosnap0/dev_apps /source/path/ nfs rw,xattr,dev=5e40001 1362894854
- 복사 명령이 정지되는 원인을 이해하도록 도와줄 수 있는 사람이 있습니까?
- 응용 프로그램이 실행 중이고 다른 프로세스가 특정 파일에 액세스하는 것을 어떻게든 방해하고 있을 수 있다고 추측할 수 있습니다.
cp
하지만 이 경우에는 무기한 차단되기보다는 중단하고 오류를 발생시키고 싶습니다 .- 업데이트에 따르면 해당 프로세스는
PID=25057
해당 파일을 열린 파일로 사용하고 있는 것으로 보입니다. 그런데 왜 이것이cp
명령을 차단할까요?
답변1
파일 설명자 10의 출력을 보면 pfiles
파일이 FIFO라는 것을 알 수 있습니다. p
목록의 유형이 이를 확인합니다 ls
. FIFO의 특성은 다른 프로세스가 데이터를 쓰지 않는 한 블록을 읽는 것이므로 cp
해당 내용을 읽으려고 할 때 멈추게 됩니다.
이 문제를 해결하려면 rsync
대신 디렉터리 트리를 복사하면 됩니다.
rsync -a /source/path/Oracle /target/path
rsync
원본 FIFO에서 읽는 대신 중복 FIFO를 생성할 수 있을 만큼 똑똑합니다. 디렉터리가 해당 위치에 생성되므로 Oracle
대상을 지정하지 마십시오 .rsync