2013-12-11 16 views
5

Tôi đang sử dụng NSTask để thực hiện một loạt các lệnh chạy dài như vậy:Chấm dứt một NSTask và con của nó

commandToRun = @"command 1;command2"; 
NSArray *arguments = [NSArray arrayWithObjects: 
         @"-c", 
         commandToRun, 
         nil]; 
self.task = [[NSTask alloc] init]; 
[self.task setLaunchPath: @"/bin/sh"]; 
[self.task setArguments: arguments]; 
[self.task launch]; 

Điều này tạo ra một quy trình để vỏ, và một quá trình con cho bất cứ lệnh đang chạy ở thời gian (lệnh 1 hoặc lệnh 2). Nếu tôi giết nhiệm vụ với [self.task terminate] nó chỉ giết chết quá trình cha mẹ. Có cách nào để xác định và giết bọn trẻ không?

+0

Theo tài liệu chấm dứt, gửi SIGTERM tới các mục phụ. Bạn có chắc nhiệm vụ phụ của bạn có thể nghe SIGTERM không? –

+0

Một giải pháp không liên quan đến trình bao sẽ là tạo NSTask cho mỗi quá trình. Nếu chúng có nghĩa là bị xích lại, (a) mã hiện tại của bạn sẽ không làm điều đó và (b) với hai NSTask, bạn có thể khởi chạy mã thứ hai từ 'terminationHandler' đầu tiên. –

Trả lời

4

Nó không phải chính xác thanh lịch, nhưng bạn có thể làm cho sh ra mắt các nhiệm vụ nhỏ như quá trình nền và sau đó viết PID của họ vào một tập tin bằng cách sử dụng biến vỏ $! theo here, ngăn chặn cho đến khi mỗi quá trình nền hoàn để duy trì asynchronicity:

commandToRun = @"command1 & echo $! > /tmp/childpid; wait $!; command2 & echo $! > /tmp/childpid; wait $!"; 

Sau đó, khi bạn gọi [self.task terminate] bạn cũng nên gọi:

system("kill -9 `cat /tmp/childpid`");
... hoặc nội dung nào đó tương đương.

+0

Điều đó sẽ hiệu quả. Nó thực sự không khủng khiếp như tôi nghĩ tôi sẽ phải làm. Cảm ơn! – stdout

Các vấn đề liên quan