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