2012-09-16 27 views
8

Tôi đang chạy một chương trình java trong Windows thu thập nhật ký từ các sự kiện Windows. Tệp .csv được tạo trên đó một số hoạt động nhất định sẽ được thực hiện.Java: đợi cho quá trình thực hiện cho đến khi nó thoát

Các lệnh được thực hiện và đường ống. Làm thế nào tôi có thể khiến chương trình Java của tôi đợi đến khi quá trình kết thúc?

Dưới đây là đoạn mã tôi đang sử dụng:

Runtime commandPrompt = Runtime.getRuntime(); 
try {   
    Process powershell = commandPrompt.exec("powershell -Command \"get-winevent -FilterHashTable @{ logname = 'Microsoft-Windows-PrintService/Operational';StartTime = '"+givenDate+" 12:00:01 AM'; EndTime = '"+beforeDay+" 23:59:59 '; ID = 307 ;} | ConvertTo-csv| Out-file "+ file +"\""); 
//I have tried waitFor() here but that does not seem to work, required command is executed but is still blocked 
} catch (IOException e) { } 
// Remaining code should get executed only after above is completed. 
+1

Hoặc bạn có thể xem xét sử dụng Commons-exec: http://commons.apache.org/exec/tutorial .html –

Trả lời

12

Bạn cần phải sử dụng waitFor() thay vì wait(). Bằng cách đó, luồng của bạn sẽ chặn cho đến khi lệnh được thực hiện kết thúc.

+0

Không có giải pháp nào tôi đã đề cập ở trên mà waitfor() không hoạt động trong các bình luận. Nếu nó làm việc sau đó sẽ không có vấn đề – user1631171

1

Thao tác này sẽ hoạt động. Nếu không, xác định chính xác những gì không làm việc

Runtime commandPrompt = Runtime.getRuntime(); 
try {   
    Process powershell = commandPrompt.exec("powershell -Command \"get-winevent -FilterHashTable @{ logname = 'Microsoft-Windows-PrintService/Operational';StartTime = '"+givenDate+" 12:00:01 AM'; EndTime = '"+beforeDay+" 23:59:59 '; ID = 307 ;} | ConvertTo-csv| Out-file "+ file +"\""); 
    powershell.waitFor(); 
} catch (IOException e) { } 
// remaining code 
+0

Thực ra tôi đã thử điều này. Tệp CSV sẽ được cung cấp dưới dạng đầu ra theo lệnh nhưng phần còn lại của mã bắt đầu thực thi trước khi CSV được tạo. Tôi tin rằng điều này có thể là do đường ống được sử dụng trong lệnh. – user1631171

+0

Đó là một loại điều kiện đua. Bạn không thể dựa vào việc tạo tệp trên các hệ thống tệp đệm được lưu trong bộ đệm ẩn. Nếu mã tiếp theo của bạn dựa vào tập tin này, bạn có thể giữ nó trong bộ nhớ thay vào đó hoặc thăm dò hệ thống tập tin cho nó. (Linux đã chọn/epoll cho điều đó) – tuergeist

+0

Có, tôi đã sửa chữa tạm thời bằng cách bỏ phiếu nếu tệp được tạo. Và có một điều kiện chủng tộc khi tệp được tạo. – user1631171

4

Tôi tìm thấy câu trả lời ở đây Run shell script from Java Synchronously

public static void executeScript(String script) { 
    try { 
     ProcessBuilder pb = new ProcessBuilder(script); 
     Process p = pb.start(); // Start the process. 
     p.waitFor(); // Wait for the process to finish. 
     System.out.println("Script executed successfully"); 
    } catch (Exception e) { 
     e.printStackTrace(); 
    } 
} 
Các vấn đề liên quan