如何使用Runtime.exec在Bash后台运行Java runnable JAR进程
我正在尝试运行一个Java runnable JAR,在前台做一些事情,然后让它进入后台。。。我在代码中使用以下putInBackground方法来查找与“command”字符串匹配的进程,获取其PID,向其发送SIGSTOP、bg,并disown-h it。。。我有以下代码:如何使用Runtime.exec在Bash后台运行Java runnable JAR进程,java,bash,shell,executable-jar,runtime.exec,Java,Bash,Shell,Executable Jar,Runtime.exec,我正在尝试运行一个Java runnable JAR,在前台做一些事情,然后让它进入后台。。。我在代码中使用以下putInBackground方法来查找与“command”字符串匹配的进程,获取其PID,向其发送SIGSTOP、bg,并disown-h it。。。我有以下代码: import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Co
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class CommandUtil
{
private static final String GPID = "ps -ef | grep '%s' | grep -v grep | awk '{print $2}'";
private static final String PCMD = GPID + " | xargs %s";
private static final String STOP = "kill -19";
private static final String BCKG = "bg";
private static final String DSON = "disown -h";
private static Runtime runtime;
private static Process process;
private static BufferedReader bufferedReader;
private static String outputLine;
private static boolean runtime() {
return (runtime = Runtime.getRuntime()) != null;
}
public static boolean putInBackground(String command) {
if(runCmdPid(command, STOP)) {
if(runCommand(BCKG)) {
return runCommand(DSON);
}
}
return false;
}
public static boolean runCmdPid(String command, String xargs) {
return runCommand(String.format(PCMD, command, xargs));
}
public static boolean runCommand(String command) {
if(runtime() && command != null && !command.isEmpty()) {
try {
process = runtime.exec(command);
process.waitFor();
bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
while ((outputLine = bufferedReader.readLine()) != null) {
System.out.println(outputLine);
}
bufferedReader.close();
} catch (IOException | InterruptedException e) {
e.printStackTrace();
return false;
}
return true;
}
return false;
}
}
…不幸的是,当我尝试使用上述CommandUtil类(通过SSH远程)将调用类的JAR放到后台时,我得到了以下输出:
java.io.IOException:无法运行程序“bg”:错误=2,没有此类文件或
位于java.lang.ProcessBuilder.start的目录(ProcessBuilder.java:1048)
位于java.lang.Runtime.exec(Runtime.java:620)
java.lang.Runtime.exec(Runtime.java:450)位于
java.lang.Runtime.exec(Runtime.java:347)位于
查找.me.home.tools.CommandUtil.runCommand(CommandUtil.java:42)
find.me.home.tools.CommandUtil.putInBackground(CommandUtil.java:27)
在find.me.home.FindMeAndelsbolig.main(FindMeAndelsbolig.java:84)中
sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)位于
invoke(NativeMethodAccessorImpl.java:62)
在
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
位于java.lang.reflect.Method.invoke(Method.java:498)
org.eclipse.jdt.internal.jarinjarloader.JarRsrcLoader.main(JarRsrcLoader.java:58)
原因:java.io.IOException:error=2,此时没有此类文件或目录
位于的java.lang.UNIXProcess.forkAndExec(本机方法)
UNIXProcess.java:248)
java.lang.ProcessImpl.start(ProcessImpl.java:134)位于
java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)。。。还有11个
我将非常感谢在这里提供的任何帮助。。。我知道只运行一个bash脚本,然后在命令末尾添加&以将其放在后台会容易得多,但我需要允许事先输入密码。此外,我认为我不能从bash脚本运行它,因为我必须等待密码输入,然后才能将其放到后台
无论如何,谢谢你,谢谢所有人,祝你度过愉快的一天
真诚地,
Piotr.尝试为
bg
/usr/bin/bg
@derlarsschneider使用绝对路径,不幸的是结果是相同的:/java.io.IOException:cannotrunprogram”/usr/bin/bg:error=2,java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)(…)