我有一个Windows / Java应用程序,可以在linux机器上执行命令。一个特定的命令会杀死进程,但是这会间歇性地失败,什么也不做,甚至没有例外。
public static Session getSession(String ipAddressOfLinuxBox) {
try {
JSch jsch = new JSch();
Session session = jsch.getSession("root", ipaddress, 22);
session. setPassword("blahblah");
session.setConfig("StrictHostKeyChecking"; "no");
} catch (JSchException je) {throw je;}
}
public static List<string> executeExecCommand(String command, String ipAddress) {
Session session = getSession(ipAddressOfLinuxBox);
Channel channel = session.openChannel("exec"));
((ChannelExec)channel).setCommand(command);
Channel.setInputStream(null);
((ChannelExec)channel).setErrStream(System.err);
InputStream input = channel.getInputStream();
channel.connect();
List<string> output = new ArrayList<>();
try {
InputStreamReader inputReader = new InputStreamReader(input);
BufferedReader bufferedReader = new BufferReader(inputReader);
String line = null;
while ((line = bufferedReader.readLine()) != null) {
output.add(line);
logger.debug(line);
}
bufferedReader.close();
inputReader.close();
} catch (IOException ex) {
ex.printStackTrace();
}
channel.disconnect();
session.disconnect();
return output;</string></string>
}catch(Throwable t) {.........}
private static String KILLCOMMAND= "ps aux | grep -i xxx | awk '{print $2}' | xargs kill -9";
protected void stopXxxProcess(ipAddressOfLinuxBox) {
try {
executeExecCommand(KILLCOMMAND, ipAddressOfLinuxBox) {
List<string> list =FINDXXXProcessesCommand;
assertEquals(2, list.size());
etc
etc
}
此代码通常成功执行。问题是上述代码有时有时无法终止进程。我也不例外。
运行相同命令的腻子会话将成功终止进程。之后,上面的应用程序代码再次开始工作。我可以启动进程Xxx,该进程启动子进程并使用上述代码杀死它们。我可能要等一两天才能再次出现问题。
存在问题时,我尝试了可以成功运行的单元测试:
String command2 = "ps aux | grep -i xxx | awk '{print $2}' "
List<string> list = execute(command, ipAddressOfLinuxBox);
for (String pid : list) {
List<string> list2 = executeCommand(("kill -9 " + pid), ipAddressOfLinuxBox);
}
那为什么“ ps aux | grep -i xxx | awk'{print $ 2}'| xargs kill -9”; 有时不起作用?这是复合命令问题吗?
感谢所有帮助/答复。