Làm thế nào để tôi đòi lại một quá trình từ chối?


12

Tương tự như nhiều câu hỏi trước đây, tôi thấy mình đang điều hành một công việc mà tôi ước mình đã chạy trên màn hình. Tôi đã buộc phải từ chối quá trình vì tôi cần ngắt kết nối. Bây giờ tôi đã kết nối lại, tôi thấy rằng quá trình vẫn đang chạy. Làm thế nào tôi có thể "đòi lại" quá trình, để tôi có thể thấy đầu ra của nó và cho nó đầu vào?

Câu hỏi này khác với việc chỉ chuyển một quy trình đang chạy sang màn hình, trong đó nó liên quan đến việc mở lại các thẻ điều khiển stdin / out / err bị mất.


Câu trả lời:


6

Đây là một câu hỏi trùng lặp - xem Di chuyển một quy trình đã chạy sang Màn hình , chỉ ra retty , đó là một vụ hack khủng khiếp tự mô tả thực hiện những gì tôi luôn đoán có thể có thể nhưng chưa bao giờ thực sự thử: nó tìm thấy fd 0, 1 và 2 (tương ứng tiêu chuẩn vào, ra và lỗi) cho quá trình và gắn vào chúng, giống như một ký sinh trùng dị thường khủng khiếp không nên có.


Tôi không biết về chương trình này - mặc dù sự thật được nói, nhưng nó không phải là cách thực hành tốt để sử dụng nó! Câu trả lời tốt, bất kể.
Andrew M.

6

Bằng cách từ chối quá trình, bạn thực sự nói rằng bạn muốn nó bỏ qua SIGHUP do thiết bị đầu cuối phát hành. Khi bạn đóng phiên của mình (giả sử bash), quy trình này sẽ trở thành sở hữu của init. Vì vậy, khi bạn nói rằng bạn muốn sở hữu lại một quy trình sau khi bạn đã từ bỏ quyền sở hữu, bạn nói rằng bạn muốn lấy quyền sở hữu khỏi một quy trình khác - không được thực hiện và vì lý do chính đáng. Điều này không thể thực hiện một cách duyên dáng trong Linux.


1
Các quy trình không sở hữu các quy trình khác khá giống như vậy. Một quá trình từ chối vẫn đang chạy như bạn.
mattdm

Họ làm một khi phiên phụ huynh đã kết thúc - như được chỉ ra bởi câu hỏi của anh ấy. Tôi cập nhật câu trả lời của tôi để phản ánh điều này.
Andrew M.

Quá trình cha mẹ thay đổi thành init, nhưng khác với quyền sở hữu. EUID và UID của quy trình vẫn là của người dùng ban đầu. Mặt khác, điều này có thể có khả năng khai thác, bởi vì mọi người dùng sẽ đột nhiên có cách chạy mã như một người dùng khác và một người dùng hệ thống không hơn không kém.
mattdm

1
EUID / UID! = PPID. Tôi đang nói về quyền sở hữu quy trình, không phải quyền.
Andrew M.

Vâng, tôi nghĩ rằng chúng tôi đồng ý về mọi thứ trừ ý nghĩa của thuật ngữ "quyền sở hữu quy trình". Điều này đề cập đến id người dùng mà quá trình được liên kết, không phải quá trình cha của nó. Có thể sự nhầm lẫn là do lệnh disownbash-cụ thể, mặc dù tên, thực sự không liên quan gì đến việc thay đổi quyền sở hữu quy trình.
mattdm
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.