我们正在使用JNA调用来运行ImageMagick命令。
最初每个调用都成功,我们没有发现任何问题,稍后几天后我们发现一些ImageMagick命令失败。现在,每个命令都失败了。
我们在服务器日志中找不到任何例外。
我是否知道成功运行这些命令需要进行哪些更改。
public class runMagick {
private interface CLibrary extends Library {
CLibrary INSTANCE = (CLibrary) Native.loadLibrary((Platform.isWindows() ? "msvcrt" : "c"), CLibrary.class);
int system(String cmd);
}
public void runCmd() {
String strCommand = "convert test.jpg test.gif";
CLibrary.INSTANCE.system(strCommand);
}
}
操作系统:Linux JAVA版本:1.6.0_34
我们最近观察到两件事:
服务器重启后,每个JNA调用都正常工作 发现创建和运行的更多java线程。我们使用以下命令来获取运行的线程数
ps -e -T | grep java | wc -l </ em>
773
服务器重启后,上述命令的计数返回较少的数字。
ps -e -T | grep java | wc -l </ em>
153
JNA调用是否会创建单独的java线程?
导致JNA调用失败的java线程数是多少?
答案 0 :(得分:0)
您没有在Java中获得任何异常,因为Java没有遇到任何问题。它将代码传递给C,并在C代码运行后获得控制权,无论是否成功。
请注意,system()
调用会返回int
。 This value has meaning:
错误时返回的值为-1,否则返回命令的返回状态。
所以你应该捕获这个返回值,例如
int ret = CLibrary.INSTANCE.system(strCommand);
然后你可以测试ret
的值。如果值为-1,则表示运行shell命令时出现问题(system()
调用/bin/sh -c
,因此您可以查看。)否则,返回值将是您的命令的结果,在此case convert
命令。这是a list of possible results。
ret
成功时应该等于0,否则,您可以在上面的链接中查找ret
的值,并获得无法正常工作的具体原因。