风暴版本:1.2.2 平台:Windows Server 2008
我已经在一台Linux服务器和一台Windows服务器上安装了风暴集群。这两个服务器都已部署了nimbus和超级用户服务。 我启动了一个拓扑,然后杀死了它。我发现Windows服务器上的主管进程错误退出,Windows服务器上的辅助进程仍然存在。
它表明:
“错误:无法杀死pid xxx进程,只能终止此操作 进程(使用\ F选项)。“
错误消息从下面的图片转换: error-info-pic
我不知道此错误,我已经使用Google搜索了一些答案,但没有找到任何答案,因此我将此消息发送给您。我希望你能帮助我。
更新于2018/12/24
我发现工作程序将启动一个拓扑过程,首先杀死拓扑错误,然后在杀死主管时杀死工作程序错误。
我已经编译了一个新的storm-core.jar,并在主管杀死工人时添加了一些详细日志,错误详细日志如下:
org.apache.storm.shade.org.apache.commons.exec.ExecuteException:进程退出,错误为128(退出值:128) 在org.apache.storm.shade.org.apache.commons.exec.DefaultExecutor.executeInternal(DefaultExecutor.java:377)〜[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.shade.org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:160)〜[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.shade.org.apache.commons.exec.DefaultExecutor.execute(DefaultExecutor.java:147)〜[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.utils.Utils.execCommand(Utils.java:1914)〜[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.utils.Utils.sendSignalToProcess(Utils.java:1943)[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.utils.Utils.killProcessWithSigTerm(Utils.java:1962)[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.daemon.supervisor.Container.kill(Container.java:166)[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.daemon.supervisor.Container.kill(Container.java:184)[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.daemon.supervisor.Slot.killContainerForChangedAssignment(Slot.java:311)[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.daemon.supervisor.Slot.handleRunning(Slot.java:527)[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.daemon.supervisor.Slot.stateMachineStep(Slot.java:265)[storm-core-1.2.2.jar:1.2.2] 在org.apache.storm.daemon.supervisor.Slot.run(Slot.java:752)[storm-core-1.2.2.jar:1.2.2]
答案 0 :(得分:0)
这是一个黑暗的镜头,但是您是否以管理员身份运行Storm进程? Storm需要在Windows上以管理员身份运行,或者您需要设置运行Storm的用户以允许进行符号链接。
关于在Windows https://storm.apache.org/releases/2.0.0-SNAPSHOT/windows-users-guide.html上运行Storm的一些知识。
答案 1 :(得分:0)
我在“ org.apache.storm.utils.Utils :: sendSignalToProcess”函数中编译了一个新的storm-core.jar,我添加了一些日志消息,如下所示:
public static void sendSignalToProcess(long lpid, int signum) throws IOException {
String pid = Long.toString(lpid);
try {
// add this log
LOG.info("Added: {}.", signum);
if (isOnWindows()) {
// change this condition
if (signum == SIGKILL || signum == SIGTERM) {
// change this code
execCommand("taskkill", "/F", "/T", "/pid", pid);
} else {
execCommand("taskkill", "/pid", pid);
}
} else {
execCommand("kill", "-" + signum, pid);
}
} catch (ExecuteException e) {
LOG.info("Error when trying to kill {}. Process is probably already dead.", pid);
} catch (IOException e) {
LOG.info("IOException Error when trying to kill {}.", pid);
throw e;
}
}
我发现,当风暴杀死拓扑时,主管将信号15(term)发送给工作人员,但是当使用信号15时,主管无法杀死该工人,必须使用信号9(kill)强制杀死。因此,我决定在Windows服务器上使用新的编译后的storm-code.jar。
我仍然不知道为什么主管不能杀死工人使用信号15,而只能使用信号9(即:taskkill use / F选项可以杀死工人),但这应该是Windows问题,所以我关闭了这个问题