2010-04-21 3 views
1

그래서이 문제에 관한 멋진 이야기가 있습니다 :jython, pyro 및 ant를 사용하여 IOException 오류를 방지하는 방법은 무엇입니까?

짧은 버전 : 우리는 우리가 사용하고있는이 소프트웨어 항목에 대한 배포 시스템을 구축 중입니다. 기본적으로 빌드 아티팩트를 가져 와서 ftp 서버에 저장하고 스크립트를 실행하여 서버를 패치하는 여러 클라이언트에게 전달합니다.

긴 버전 :

1 배포 서버

여러 클라이언트 서버

소프트웨어 : 자이 썬 2.5.1, 개미 1.8.0, 3.10

배포 서버가 파이 FTP 서버 및 PYRO 클라이언트가 실행됩니다. 각 클라이언트 서버에는 PRYO 서버가 실행됩니다.

PYRO 클라이언트에게 패치 절차를 시작하라는 메시지가 표시되면 모든 클라이언트 서버 목록이 포함 된 컴퓨터 목록이 읽습니다. 그런 다음 각 PYRO 서버에 하나씩 연결하고 패치 절차를 실행하십시오. 프로 시저는 getPatch (해당 서버에 대한 최신 패치 확보), StopServer (패치해야 할 대상에 액세스 할 수도 있고 액세스하지 않을 수도있는 소프트웨어 중지), 패치 적용, StartServer입니다. 각 프로세스는 ANT 스크립트를 호출하여 일부 폴더 이름과 다른 구성 전달을 전달합니다. 재미있는 부분은 패치를 적용 할 때 발생합니다. 오류 로그는 아래를 참조하십시오. NDA 이유로 인해 폴더 이름을 제거해야했습니다.

이것은 흥미로운 부분입니다. 프로 시저의 각 섹션을 개별적으로 실행합니다. 즉 getPatch, StopServer 등을 한 번에 하나씩 수동으로 실행하는 것입니다. 이 버그는 발생하지 않습니다. 물리적으로 기계에 가서 프로세스가 실행되지 않는다. 단지 4 개의 프로세스 모두를 하나씩 호출해야합니다. 이는 ANT 대체 스크립트가 여러 파일에서 호출 될 때 ApplyPatch 단계 중에 발생합니다. 우리는 JVM이 파일을 1 초 또는 2 초 동안 유지하는 것과 관련이 있다고 생각합니다. 그러나 이것은 개미의 버그 노트에 따라 패치 된 것입니다. 짧은 너무

:

배포 서버 ==> 자이 썬 ==> 파이로 연결 ==> 클라이언트 서버 ==> 자이 썬 ==> 개미 스크립트

오류 로그 :

<*snip>\ant\deploy.xml:12: IOException in <*snip>\bin\startGs.sh - java.io.IOException:Failed to delete <*snip>\bin\rep4698373081723114968.tmp while trying to rename it. 
    at org.apache.tools.ant.taskdefs.Replace.processFile(Replace.java:709) 
    at org.apache.tools.ant.taskdefs.Replace.execute(Replace.java:548) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360) 
    at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1212) 
    at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:441) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:302) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:221) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360) 
    at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1212) 
    at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:441) 
    at org.apache.tools.ant.Extaskdefs.SubAnt.execute(SubAnt.java:302) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:221) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.MacroInstance.execute(MacroInstance.java:398) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at net.sf.antcontrib.logic.IfTask.execute(IfTask.java:197) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.TaskAdapter.execute(TaskAdapter.java:154) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.GeneratedMethodAccessor5.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.Target.execute(Target.java:390) 
    at org.apache.tools.ant.Target.performTasks(Target.java:411) 
    at org.apache.tools.ant.Project.executeSortedTargets(Project.java:1360) 
    at org.apache.tools.ant.helper.SingleCheckExecutor.executeTargets(SingleCheckExecutor.java:38) 
    at org.apache.tools.ant.Project.executeTargets(Project.java:1212) 
    at org.apache.tools.ant.taskdefs.Ant.execute(Ant.java:441) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:302) 
    at org.apache.tools.ant.taskdefs.SubAnt.execute(SubAnt.java:221) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 
    at org.apache.tools.ant.Task.perform(Task.java:348) 
    at org.apache.tools.ant.taskdefs.Sequential.execute(Sequential.java:68) 
    at org.apache.tools.ant.UnknownElement.execute(UnknownElement.java:291) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at org.apache.tools.ant.dispatch.DispatchUtils.execute(DispatchUtils.java:106) 

it at org.apache.tools.ant.Task.perform (Task.java:348) at org.apache.tools.ant.taskdefs.MacroInstance.execute (MacroInstance.java:398) at org.apache.tools .ant.UnknownElement.execute (UnknownElement.java:291)sun.reflect.DelegatingMethodAccessorImpl.invoke에서 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) 에서 sun.reflect.NativeMethodAccessorImpl.invoke0 (기본 방법) (DelegatingMethodAccessorImpl.java:25) 에서 1,363,210주는 java.lang에서 .reflect.Method.invoke (Method.java:597) at org.apache.tools.ant.dispatch.DispatchUtils.execute (DispatchUtils.java:106) at org.apache.tools.ant.Task.perform (Task .java : 348) at org.apache.tools.ant.taskdefs.Sequential.execute (Sequential.java:68) at org.apache.tools.ant.UnknownElement.execute (UnknownElement.java:291) at sun .reflect.NativeMethodAccessorImpl.invoke0 (네이티브 메소드) at sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke (DelegatingMethodAccessorImpl.java:25)에서 java.lang.reflect.Method.invoke (Method.java:597)에서 org.apache에서 . (org.apache.tools.ant.taskdefs.MacroInstance에서 ). 실행 (MacroInstance.java:398) sun.reflect.DelegatingMethodAccessorImpl.invoke에서 sun.reflect.NativeMethodAccessorImpl.invoke (NativeMethodAccessorImpl.java:39) 에서 sun.reflect.NativeMethodAccessorImpl.invoke0 (원시 메소드)에 (DelegatingMethodAccessorImpl.java : 25) at java.lang.reflect.Method.invoke (Method.ja va : 597) at org.apache.tools.ant.dispatch.DispatchUtils.execute (DispatchUtils.java:106) at org.apache.tools.ant.Task.perform (Task.java:348) at org. apache.tools.ant.taskdefs.Parallel $ TaskRunnable.run (Parallel.java:433) (Thread.java:619) 발생 원인 : java.io.IOException : 삭제 실패 < * snip> \ bin \ rep4698373081723114968.tmp로 바꿉니다. at org.apache.tools.ant.util.FileUtils.rename (FileUtils.java:1248) at org.apache.tools.ant.taskdefs.Replace.processFile (Replace.java:702) ... 125 자세히

도움을 주시면 감사하겠습니다.

답변

1

FTP가 문제인 것처럼 보입니다. 그것은 개별 폴더에 jython을 통해 잠금을 유지합니다. 따라서 새 파일이 도입되면 파일을 삭제할 수없는 상태로 잠급니다. 여전히 파일을 편집 할 수 있습니다. 즉, 파일에서 대체 스크립트를 실행하십시오. 그러나 당신은 그것을 삭제할 수 없습니다. ftp의 다른 구현으로 작업하겠습니다. ie ant 대신 java/jython의 버전을 사용하십시오.

+0

ftp가 아닙니다. 멋진 버그. Ant가 파일 집합에 대해 이미 호출 된 경우 대체 스크립트를 잠글 수 있습니다. 자세히 : 외부 스크립트가 2 개 ant 스크립트를 호출하고 두 개 ant 스크립트가 동일한 폴더에서 replace를 호출하면 두 번째 대체 스크립트는 첫 번째 스크립트가 실행되었음을 감지 할 수 없으므로 실패합니다. 참고로, 개미는 현재 개미 스크립트가 끝날 때까지 임시 파일을 정리하지 않는 것으로 보입니다. – Kelso

관련 문제