什么样的问题会导致Java的ProcessBuilder.start方法返回一个带有错误= 5的注释的IOException?
具体来说,我们已经看到一个远程客户系统运行一些Java代码......
ProcessBuilder pb = new ProcessBuilder(cmdArray);
pb.redirectErrorStream(true);
Process p = pb.start();
Run Code Online (Sandbox Code Playgroud)
...抛出这样的异常......
java.io.IOException: CreateProcess: C:\example\example.exe argument1 argument2 error=5
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.<init>(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
at java.lang.ProcessBuilder.start(Unknown Source)
at example_code_above
Run Code Online (Sandbox Code Playgroud)
我们已经确认在异常"C:\ example\example.exe argument1 argument2"中注明的命令可以通过cmd.exe手动成功运行,因此我们相信命令本身不会被破坏.
我正在尝试找到一个开源业务规则引擎,它具有构建规则的良好界面.
或者至少有一个在.Net平台上运行良好并且在过去12个月的某个时间更新过.
谢谢,
前段时间我正在阅读W3C关于" 重写脚本内容中使用字符串 "的文章,其中包含一些有关国际化的有用建议,但这让我感到不安,因为我们认为DRY(不要重复自己)消除重复代码的原则.
举个例子,我们可能会有这样的代码......
print "The printer is ";
if (printer.working) {
print "on.\n";
} else {
print "off.\n";
}
print "The stapler is ";
if (stapler.working) {
print "on.\n";
} else {
print "off.\n";
}
Run Code Online (Sandbox Code Playgroud)
我的直觉是大致消除重复如下......
report-state(printer, "printer");
report-state(stapler, "stapler");
function report-state(name, object) {
print "The "+name+" is ";
if (object.working) {
print "on\n";
} else {
print "off\n";
}
}
Run Code Online (Sandbox Code Playgroud)
...但是,如果我们需要将其本地化为西班牙语,那么这样做会导致代码出现问题,因为在这两种情况下,"on"这个词明显不同.
所以,我想我的问题是,其他开发人员如何平衡DRY原则与其代码的国际化?
我的一部分想要争辩说,国际化是" 你不会需要它 "的极端编程之一.然而,另一方面,考虑到DRY原则的重构应该通过使其易于实现所需的功能来平衡这一点,而不是像在这里那样更难.
我在构建服务器上有一个间歇性问题,其中构建中的Java进程无法终止并且似乎永远运行(使用100%的CPU)永远(我已经看到它在周末运行了2天以上通常需要大约10分钟).kill -9 pid似乎是阻止这个过程的唯一方法.
我试过调用kill -QUIT pid这个过程,但它似乎没有产生任何到STDOUT的堆栈跟踪(也许它没有响应信号?).没有-F force选项的jstack似乎无法连接到正在运行的JVM,但是使用force选项它会产生下面包含的输出.
不幸的是,即使有了堆栈跟踪,我也看不到任何明显的进一步调查路径.
据我所知,它显示了两个运行Object.wait的'BLOCKED'线程(它们的堆栈似乎只包含核心Java代码,不包含我们的代码)和第三个没有堆栈输出的'IN_VM'.
我应采取哪些步骤来收集有关问题原因的更多信息(或者更好,我该如何解决)?
$ /opt/jdk1.6.0_29/bin/jstack -l -F 5546
Attaching to process ID 5546, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.4-b02
Deadlock Detection:
No deadlocks found.
Finding object size using Printezis bits and skipping over...
Thread 5555: (state = BLOCKED)
Locked ownable synchronizers:
- None
Thread 5554: (state = BLOCKED)
- java.lang.Object.wait(long) @bci=0 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove(long) @bci=44, line=118 (Interpreted frame)
- java.lang.ref.ReferenceQueue.remove() @bci=2, line=134 … 我写了一个简单的java程序来基本上运行:
System.out.println(InetAddress.getLocalHost().getHostName());
如果我在 Java 1.7.231 或 1.8.221 上编译它并在 RHEL 7.7 上运行它,它会返回 FQDN (computer.domain.com),但在同一服务器上,在 RHEL JDK 11.0.2 中编译它,它仅返回服务器名称。
据我了解,它应该执行反向 DNS 查找(基本上是主机名 -f),但对于 JDK 11,行为肯定有所不同。知道为什么会发生这种情况吗?
想象一下,我有一个在Windows下作为特定用户运行的现有进程.难道是允许该过程中采取其当前令牌(喜欢的东西OpenThreadToken和DuplicateTokenEx),它传递给另一个进程在同一台机器上(可能通过网络接口或其他一些IPC),然后希望这一进程能够用它来调用CreateProcessAsUser?
从我已阅读(文档http://msdn.microsoft.com/en-us/library/ms682429%28VS.85%29.aspx),我什么也没看见,禁止这个,但也许只能用令牌由创建它的线程或进程.
(为什么你会吗?我想有一个web请求来IIS,进行身份验证,已IIS安排远程用户的模拟,然后通过模拟令牌到另一台服务器的过程(在同一台机器上),使服务器进程可以在远程用户的上下文中执行一些安全检查)
有没有一种简单的方法可以在SQL Server中删除一组相互关联的表?理想情况下,我想避免担心他们被拒绝的顺序,因为我知道整个团队将在整个过程结束时消失.
我遇到一个问题我从来没有找到一个很好的解决方案......
假设您在版本7500中从subversion检出了工作副本,并且持有当前存储库的磁盘已经死亡.您可以在修订版7450中获得存储库的备份.恢复存储库备份很容易,但是任何尝试使用工作副本的操作都会产生错误,说明存储库中不存在修订版7500.
检查一个巨大的修订版以使存储库的内容与工作副本的内容相匹配并使其工作副本恢复到功能状态的最佳方法是什么?
(理想情况下,我想要查看一个全新的工作副本,然后手动复制所有文件更容易 - 我认为当时工作副本用于配置管理服务器,所以有一个真正的痛苦查看干净的工作副本)