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