2011-01-19 39 views
6

Tôi đang mở một quy trình chạy dài với popen(). Để gỡ lỗi, tôi muốn chấm dứt quá trình trước khi quá trình này hoàn tất. Gọi PClose() chỉ chặn cho đến khi trẻ hoàn thành.Quá trình giết chết được mở bằng popen()?

Tôi làm cách nào để có thể hủy quá trình? Tôi không thấy bất kỳ cách dễ dàng để có được pid ra khỏi tài nguyên mà popen() trả về để tôi có thể gửi cho nó một tín hiệu.

Tôi cho rằng tôi có thể làm điều gì đó kludgey và cố gắng lận pid vào sản lượng sử dụng một số loại dòng lệnh hackery ...

+0

Đây không phải là câu trả lời thực sự vì nó dành cho C chứ không phải PHP, nhưng hãy xem liên kết này để có gợi ý: http://www.monkey.org/openbsd/archive/misc/0112/msg00360.html –

Trả lời

7

Vâng, hạ cánh trên một giải pháp: tôi chuyển trở lại proc_open() thay vì popen(). Sau đó, nó đơn giản như:

$s = proc_get_status($p); 
posix_kill($s['pid'], SIGKILL); 
proc_close($p); 
+0

Tôi đã gặp vấn đề tương tự với 'proc_open()', vì vậy tôi đã thử 'popen()' đơn giản hơn, hy vọng điều đó sẽ hữu ích. Tôi đã không nhận ra, vào lúc đó, rằng * cả hai khối * 'pclose()' và 'proc_close()' cho đến khi con chấm dứt. Một khi bạn nhận ra rằng, sau đó bạn phải giết đứa trẻ. Và để giết đứa trẻ bạn cần pid, và đó không phải là sạch có sẵn với 'popen()'. 'proc_open()' làm mọi thứ 'popen()', và sau đó một số. –

+0

hãy đánh dấu câu trả lời của riêng bạn để mọi người biết bạn đã tìm ra giải pháp. – mauris

+0

@thephpdeveloper SO cung cấp cho tôi một lỗi "Bạn có thể chấp nhận câu trả lời của chính bạn vào ngày mai", ngay bây giờ. –

0

Chỉ cần gửi một kill (hoặc hủy bỏ) tín hiệu sử dụng chức năng kill:

+0

Phần khó khăn đang thực hiện một công việc tốt để tìm ra pid để giết :) Một khi bạn chắc chắn rằng bạn đã có đúng pid, sau đó bạn có thể gọi php's 'posix_kill()'. Tôi cho rằng trong hồi tưởng, tôi có thể đã grepped danh sách các pids trẻ em từ ps, vì nó dễ dàng để tìm ra pid của riêng tôi. –

0

Bạn có thể tìm pid, và kiểm tra rằng bạn đang thực sự mẹ của nó bằng cách thực hiện:

// Find child processes according to current pid 
$res = trim(exec('ps -eo pid,ppid |grep "'.getmypid().'" |head -n2 |tail -n1')); 
if (preg_match('~^(\d+)\s+(\d+)$~', $res, $pid) !== 0 && (int) $pid[2] === getmypid()) 
{ 
    // I'm the parent PID, just send a KILL 
    posix_kill((int) $pid[1], 9); 
} 

Đó là làm việc khá tốt trên một máy chủ PHP nhanh cgi.

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