このコピーコマンドがスリープ状態になる原因は何ですか?

このコピーコマンドがスリープ状態になる原因は何ですか?

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

おすすめ記事