- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
警告——原因不是文件丢失——所有线程都在调用同一个脚本文件
我正在启动 5-6 个调用 Red Hat 框中的本地脚本的线程。
我注意到有时我会收到以下错误消息
couldn't read file "/home/leo/myScript.exp": no such file or directory
显然,所有进程都在执行脚本,所以这似乎与 [1] 操作系统对可以运行脚本或访问文件以进行读取的同时进程有一些限制或 [2] Java 正在尝试执行有关一些流中的一些操作还没有准备好(我假设 commons-exec 会为我处理这个)
这是代码
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
CommandLine commandline = CommandLine.parse("/home/leo/myScript.exp");
DefaultExecutor exec = new DefaultExecutor();
PumpStreamHandler streamHandler = new PumpStreamHandler(outputStream);
exec.setStreamHandler(streamHandler);
try {
exec.execute(commandline); <<< error happens here
}catch(IOException io) {
throw new Exception("");
}
如果错误是 [1],那么我想知道如何在 linux 操作系统中放宽此限制
如果错误是 [2],那么我想知道如何告诉 commons-exec 等待资源准备好(在最坏的情况下我只会添加一些重试,但我认为这不是很优雅)
如果错误是其他原因,至少知道原因足以让我找到一些解决方案。
更新 - 3 月 15 日
好吧,事情是这样的。
该脚本是一个使用库调用Java类的expect脚本。
我注意到的一件事是脚本运行良好,直到它调用创建数据库连接的 java 方法。
因为线程数少(3~5个)我觉得不是数据库的问题。相反,在我看来,在调用 java 代码和/或在 java 代码创建数据库连接时,某些东西正在阻止脚本被调用。
我仍在尝试获取确切的异常,但期望脚本看起来像这样(有点)
#!/opt/tclblend/bin/expect -f
set edfDir "/usr/local/nssa/bin/edf";
set env(LD_LIBRARY_PATH) "/opt/tclblend/lib/tcljava1.4.1"; # for tclBlend
## always use absolute paths
set env(TCL_CLASSPATH) "/home/leoks/EclipseIndigo/workspace2/xyzJavaWrapper/bin";
set env(CLASSPATH) {/home/leoks/EclipseIndigo/workspace2/xyzTomEE/lib/commons-logging-1.1.1.jar:/home/leoks/EclipseIndigo/workspace2/xyzConfiguration/lib/commons-configuration-1.9.jar:/home/leoks/EclipseIndigo/workspace2/xyzConfiguration/lib/commons-lang-2.4.jar:/home/leoks/EclipseIndigo/workspace2/xyz/3rdPartyJDBCJars/ojdbc6.jar:/home/leoks/EclipseIndigo/workspace2/xyzJavaWrapper/lib/commons-dbutils-1.5.jar:/home/leoks/EclipseIndigo/workspace2/xyzJavaWrapper/tcl/tcllib/xyzConfiguration.jar};
source $edfDir/lib/statics.tcl;
source $edfDir/lib/acclib.tcl;
package require java
java::import com.abc.xyz.legacydriver.TCLDriverWrapper
java::import com.abc.xyz.legacydriver.LegacyDriverTaskInputData
java::import com.abc.xyz.legacydriver.LegacyDriverTaskEnum
set ticket [ lindex $argv 0 ];
set inputData [ java::call com.abc.xyz.legacydriver.TCLDriverWrapper pullNextInputData $ticket ]
pullNextInputData 的样子
public static LegacyDriverTaskInputData pullNextInputData(String token) throws Exception {
try {
return pullNextInputDataImpl(token);
} catch (Exception e) {
e.printStackTrace();
throw e;
}
}
private static LegacyDriverTaskInputData pullNextInputDataImpl(String token) throws Exception {
Connection conn = null;
try{
conn = new TCLDriverWrapper().getConnection();
QueryRunner run = new QueryRunner();
ResultSetHandler<LegacyDriverTaskInputData> rsh = new BeanHandler<LegacyDriverTaskInputData>(LegacyDriverTaskInputData.class);
LegacyDriverTaskInputData inputData = run.query(conn,"select * from LegacyDriverTask where id = ?",rsh,Long.valueOf(token));
return inputData;
} catch (ClassNotFoundException e) {
e.printStackTrace();
throw e;
} catch (SQLException e) {
e.printStackTrace();
throw e;
} finally {
DbUtils.close(conn);
}
}
getConnection() 只是一个常规的驱动程序实例化代码(它使用 apache dbutils)
private Connection getConnectionImpl() throws Exception{
Class.forName("driver name");
Properties props = new Properties();
props.put("user", UtilConf.getProperty("javawrapper.user"));
props.put("password", UtilConf.getProperty("javawrapper.password"));
return DriverManager.getConnection(UtilConf.getProperty("javawrapper.jdbc"), props);
}
一旦我得到堆栈跟踪,我就会把它放在这里
更新 - 3 月 16 日
堆栈跟踪并没有说太多:-(
2016-03-17 01:49:10,034 INFO [QProcessor] Threads started (ok=0 nok=0 wait=0) org.apache.commons.exec.ExecuteException: Process exited with an error: 1 (Exit value: 1)
at org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:404)
at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:166)
at org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:153)
at com.ericsson.xyz.tomee.q.QWorker.onMessageImpl(QWorker.java:776)
at com.ericsson.xyz.tomee.q.QWorker.onMessage(QWorker.java:303)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
at org.apache.openejb.monitoring.StatsInterceptor.record(StatsInterceptor.java:180)
at org.apache.openejb.monitoring.StatsInterceptor.invoke(StatsInterceptor.java:99)
at sun.reflect.GeneratedMethodAccessor106.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:606)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext$Invocation.invoke(ReflectionInvocationContext.java:182)
at org.apache.openejb.core.interceptor.ReflectionInvocationContext.proceed(ReflectionInvocationContext.java:164)
at org.apache.openejb.core.interceptor.InterceptorStack.invoke(InterceptorStack.java:80)
at org.apache.openejb.core.stateless.StatelessContainer._invoke(StatelessContainer.java:212)
at org.apache.openejb.core.stateless.StatelessContainer.invoke(StatelessContainer.java:181)
at org.apache.openejb.core.ivm.EjbObjectProxyHandler.synchronizedBusinessMethod(EjbObjectProxyHandler.java:268)
at org.apache.openejb.core.ivm.EjbObjectProxyHandler$1.call(EjbObjectProxyHandler.java:253)
at org.apache.openejb.async.AsynchronousPool$AsynchronousCall.call(AsynchronousPool.java:110)
at java.util.concurrent.FutureTask.run(FutureTask.java:262)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:724)
最佳答案
我要感谢所有在这个案例中提供帮助的人。
我会删除这个问题,但因为我已经悬赏了,所以我不能。 (也许当赏金到期时,如果 SO 允许,我会这样做)
我终于找到了一个没有问题的方法,它似乎与应用程序为线程分配资源的方式有关,所以鉴于问题中提供的信息,我认为这是不可能的找出根本原因。
无论如何,我会尝试在这里描述发生的事情。
问题是我注意到在 (5) (6) (7) 中。但原因在 (3) 中。
为@Asynchronous 方法提供服务的线程池的 TomEE 配置中的线程数(我的应用程序未使用默认值)少于所需的线程数,因此似乎有些资源不足。
此外,错误消息似乎有一些我尚未确定的错误,因此在这种情况下即使错误消息也可能无效。
因为问题没有解决问题所需的所有变量,所以我在这里提供关于问题的完整解释。
由于这是客户端代码,我无法提供代码或提供所有信息。甚至包名也必须进行混淆处理。
再次,我要感谢所有花时间在这里提供帮助的人,对于没有提供所有必要的数据,我深表歉意。
关于java - Apache Commons Exec - 有时线程无法在 Linux 中打开本地文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35897752/
我正在尝试设置 rbenv: https://github.com/sstephenson/rbenv#section_2 我有一个问题:我必须在一切之前使用 rbenv exec 所以现在我要做 b
我已经使用我们的应用程序创建了图像,运行该图像后,我可以看到还创建了 docker 容器,当我尝试进入 docker 容器时,出现以下错误,请您在这里帮助我。 """"OCI runtime exec
这post on javapapers.com显示如何运行 JMH通过键入 mvn exec:exec 在 Maven 中进行基准测试。在 Maven 中运行 JMH 非常方便,因为您可以轻松地从 E
因为我是 shell 脚本的新手,exec命令总是让我感到困惑,同时用 while 探索这个话题循环触发了以下 4 个问题: 下面的语法 1 和 2 有什么区别 语法 1: while read LI
湖一看这两条线 案例 1 set cvsUpdStr [exec cvs -qn upd] 案例 2 set cvsUpdStr [exec cvs -qn upd >&@stdout] 对于第一种情
我有一个配置为使用 Maven 构建和运行的项目。该项目取决于平台特定的 native 库,我正在使用发现的策略 here管理这些依赖项。 本质上,特定平台的 .dll 或 .so 文件被打包到 ja
我发现 tcl exec 命令首先从标准输出返回字符串,然后是标准错误。例如,我下面的“测试脚本”按以下顺序生成消息: puts "test started" puts stderr "some no
我有 rpc error: code = 13 desc = invalid header field value "oci runtime error: exec failed: cannot ex
过去 2 天我遇到了一个问题。 我正在运行一个 tcl 脚本(用于 eggdrop),该脚本在被触发时执行本地 shell 命令(子进程),如果命令成功,它会输出结果。但是,如果命令不成功,我会收到错
假设我有一个像这样的 TCL 脚本: exec ls -l 现在这将打印出当前目录的内容。我需要将该输出作为字符串并解析它。我怎么能做到这一点? 最佳答案 exec返回输出,因此只需为其设置一个变量:
我正在尝试在 PHP 中使用 GNUPLOT 绘制正弦图,但是当我使用 exec 绘制该图时出现此错误: Warning: exec() [function.exec]: Cannot execute
我正在尝试 mvn exec:exec (或 mvn exec:java )使用类路径中的本地 jar 运行我的程序。但是 jar 无法加载: Exception in thread "main" j
我在最新的 Docker CLI 文档中注意到 Docker CLI 命令列表已经扩展。 如果我使用 码头执行 早些时候在容器内启动可执行文件现在我也可以使用 docker 容器执行 命令。 dock
这个问题在这里已经有了答案: Call to a member function exec() on a non-object error in PHP [duplicate] (1 个回答) 关闭
手册页说“exec() 系列函数用新的过程镜像替换当前的过程镜像。”但我不太明白“用新过程图像替换当前过程图像”的含义。比如exec成功,perror就达不到 execl("/bin/ls", /*
手册页说“exec() 系列函数用新的过程镜像替换当前的过程镜像。”但我不太明白“用新过程图像替换当前过程图像”的含义。比如exec成功,perror就达不到 execl("/bin/ls", /*
我正在 UrbanCode Deploy Shell 步骤中执行以下命令。我想要的是针对找到的所有文件运行 Util.sh。 find . -type f -exec ls -al {} \; fin
仅当将“-p”添加到 org.codehaus.mojo:exec-maven-plugin:1.6.0:exec 插件时,以下 pom.xml 执行才会失败,删除此参数后它运行正常,但我需要争论,有
我正在尝试进入 Maven 并开始编写一个小型库。作为库代码的一部分,我想要一个小型演示 Java 应用程序,可以用来查看库在做什么以及如何使用它。现在真正让我烦恼的一件事是,为了执行该演示,我必须执
我是 maven 的新手,在通过 maven 运行类文件时遇到问题 它运行良好 mvn exec:java -Dexec.mainClass="com.test.Test" 但不是 mvn exec:
我是一名优秀的程序员,十分优秀!