이 복사 명령이 잠자기 상태가 되는 원인은 무엇입니까?

이 복사 명령이 잠자기 상태가 되는 원인은 무엇입니까?

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

관련 정보