如何在java或clojure中等待进程结束

如何在java或clojure中等待进程结束,java,clojure,Java,Clojure,当我没有启动的进程结束时,如何通知我,它们是恢复其退出代码和/或输出的一种方法?执行监视的进程将以root/administrator身份运行 否(至少不在Unix/Windows上)。为了收集返回代码和输出,您必须是父进程并生成它。您可以这样做。在Unix上,您可以编写一个脚本,以连续grep正在运行的进程列表,并在您搜索的进程不再存在时通知您 这是伪代码,但您可以执行以下操作: while ( true ) { str = ps -Alh | grep "process_name"

当我没有启动的进程结束时,如何通知我,它们是恢复其退出代码和/或输出的一种方法?执行监视的进程将以root/administrator身份运行

否(至少不在Unix/Windows上)。为了收集返回代码和输出,您必须是父进程并生成它。

您可以这样做。在Unix上,您可以编写一个脚本,以连续grep正在运行的进程列表,并在您搜索的进程不再存在时通知您

这是伪代码,但您可以执行以下操作:

while ( true ) {
    str = ps -Alh | grep "process_name"
    if ( str == '' ) {
        break
    }
    wait(5 seconds)
}
raise_alert("Alert!")

检查手册页中的ps。您的选项可能不同。这些是我在Mac OSX10.4上使用的程序。

您可以通过调用列出所有当前进程的shell命令并解析输出来检查某个进程当前是否正在从java运行。在linux/unix/mac os下,命令是ps,在windows下,命令是tasklist

对于ps版本,您需要执行以下操作:

ProcessBuilder pb = new ProcessBuilder("ps", "-A");
Process p = pb.start();

BufferedReader in = new BufferedReader(new InputStreamReader(p.getInputStream()));
// Skip first (header) line: "  PID TTY          TIME CMD"
in.readLine();

// Extract process IDs from lines of output
// e.g. "  146 ?        00:03:45 pdflush"
List<String> runningProcessIds = new ArrayList<String>();
for (String line = in.readLine(); line != null; line = in.readLine()) {
    runningProcessIds.add(line.trim().split("\\s+")[0]);
}
ProcessBuilder pb=新的ProcessBuilder(“ps”和“-A”);
进程p=pb.start();
BufferedReader in=新的BufferedReader(新的InputStreamReader(p.getInputStream());
//跳过第一行(标题):“PID TTY TIME CMD”
in.readLine();
//从输出行中提取进程ID
//例如“146?00:03:45 pdflush”
List runningProcessIds=new ArrayList();
对于(字符串line=in.readLine();line!=null;line=in.readLine()){
runningProcessIds.add(line.trim().split(“\\s+”)[0]);
}

我不知道有什么方法可以捕获退出代码或输出。

看起来您可以使用jna与等待pid结束的“C”方式相结合(在windows中,轮询OpenProcess(进程查询信息…)要查看它何时将进程报告为死进程,请参阅ruby的win32.c

这会捕获正在执行grepping的进程以及正在进行grepping的进程吗?在查看跟踪系统调用并考虑“重新分配”进程后,我认为轮询更为合理。