【问题标题】:how to wait for a process to end in java or clojure如何在 java 或 clojure 中等待进程结束
【发布时间】:2012-09-27 06:40:33
【问题描述】:

当我没有启动的进程结束时如何通知我,这是他们恢复其退出代码和/或输出的一种方式?进行监视的进程将以 root/管理员身份运行。

【问题讨论】:

    标签: java clojure


    【解决方案1】:

    您可以通过调用列出所有当前进程并解析输出的 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]);
    }
    

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

    【讨论】:

    • 在查看跟踪系统调用并考虑“重新设置”过程后,我认为轮询更加理智。
    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      你可以这样做。在 Unix 上,您可以编写一个脚本来不断地 grep 正在运行的进程列表,并在您正在搜索的进程不再找到时通知您。

      这是伪代码,但你可以这样做:

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

      检查 ps 的手册页。您的选择可能会有所不同。这些是我在 Mac OSX10.4 上使用的。

      【讨论】:

      • 这会捕获执行 grepping 的进程以及被 grepped 的进程吗?
      【解决方案4】:

      看起来您可以使用 jna 绑定到等待 pid 结束的“C”方式(在 Windows 中,轮询 OpenProcess(PROCESS_QUERY_INFORMATION ...) 以查看它何时将进程报告为已死,请参阅 ruby​​ 的 win32。 c

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-12-03
        • 2015-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多