如何在java或clojure中等待进程结束
当我没有启动的进程结束时,如何通知我,它们是恢复其退出代码和/或输出的一种方法?执行监视的进程将以root/administrator身份运行 否(至少不在Unix/Windows上)。为了收集返回代码和输出,您必须是父进程并生成它。您可以这样做。在Unix上,您可以编写一个脚本,以连续grep正在运行的进程列表,并在您搜索的进程不再存在时通知您 这是伪代码,但您可以执行以下操作:如何在java或clojure中等待进程结束,java,clojure,Java,Clojure,当我没有启动的进程结束时,如何通知我,它们是恢复其退出代码和/或输出的一种方法?执行监视的进程将以root/administrator身份运行 否(至少不在Unix/Windows上)。为了收集返回代码和输出,您必须是父进程并生成它。您可以这样做。在Unix上,您可以编写一个脚本,以连续grep正在运行的进程列表,并在您搜索的进程不再存在时通知您 这是伪代码,但您可以执行以下操作: while ( true ) { str = ps -Alh | grep "process_name"
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的进程吗?在查看跟踪系统调用并考虑“重新分配”进程后,我认为轮询更为合理。