Câu trả lời:
Xem xét cách các công việc linux và quyền sở hữu quy trình hoạt động, tôi e rằng không thể thực sự sở hữu lại một quy trình, mà không có sự trợ giúp từ quy trình áp dụng.
Một phụ huynh có thể 'từ chối' một đứa trẻ, sau đó được 'nhận nuôi' bởi quy trình có tên 'init'. Bảo mật hệ thống ngăn người khác lấy các quy trình của người khác. Khi bạn từ chối nó, một quá trình sẽ trở thành (các) của người khác để kiểm soát. Bạn với tư cách là 'người dùng' vẫn có thể giết quá trình, nhưng bạn không thể lấy lại được. Cố gắng ép buộc init để trả về quy trình của bạn dường như không hoạt động, vì init thậm chí không đọc thư.
Như ý nghĩa của nó, nó thực sự sôi nổi với câu trả lời "Đừng làm thế!".
reptyr
(xem câu trả lời của tôi cho một ví dụ sử dụng).
Mặc dù tôi cho rằng điều này không giúp được ai trong tình huống không may là đã từ chối quy trình sai, nếu bạn muốn trục xuất khỏi quy trình làm việc của mình và thay thế bằng:
https://github.com/nelhage/reptyr
Bạn sẽ có thể sửa chữa bất kỳ quá trình nào (tức là di chuyển nó vào bên trong màn hình).
reptyr
là giải pháp, nhưng không cần phải ngừng sử dụng disown
. Để rõ ràng, tôi đã viết một câu trả lời mới.
Tất cả bạn cần là reptyr
. Nó sống trên GitHub và đã được đóng gói cho Debian kể từ Wheezy và có lẽ cho các bản phát hành GNU / Linux khác. Nó sẽ báo trước quá trình bị từ chối của bạn trong thiết bị đầu cuối hiện tại nếu bạn gọi nó bằng ID tiến trình (PID). Ví dụ:
pgrep -f DISOWNED_PROCESS # to find out the PID of the disowned process
reptyr PID # insert this PID here
Xin lỗi, không. Về nguyên tắc, điều đó là có thể, vì việc từ chối chỉ thay đổi một số trạng thái bên trong vỏ - về cơ bản nó sẽ loại bỏ ID tiến trình khỏi danh sách và nó có thể được đưa trở lại mà không gặp quá nhiều rắc rối (bạn phải cẩn thận một chút khi kiểm tra pid được gắn lại là đúng phiên, nhưng đó không phải là không thể vượt qua). Nhưng không có shell thông thường nào (bash, ksh, tcsh, zsh) dường như có cách để thêm lại. (Mặc dù với zsh bạn có thể viết thư cho jobstates
, jobdirs
và jobtext
các mảng kết hợp, tôi không biết có bao nhiêu bạn có thể đạt được như vậy.)
Nếu bạn muốn shell gửi tín hiệu đến quy trình bị từ chối như đối với các quy trình con được sở hữu của nó, bạn có thể viết một công việc sơ khai chờ cho đến khi nhận được tín hiệu và gửi tín hiệu tương tự đến quy trình bị từ chối. Bạn có thể gửi SIGSTOP
và SIGCONT
đến quá trình từ chối để mô phỏng Ctrl+ Zvà bg
. Không ai trong số này sẽ khá thuận tiện như sở hữu lại.
Hoàn cảnh là gì? Nếu bạn chỉ muốn lấy lại thiết bị đầu cuối của mình một lúc, bạn có thể sử dụng Màn hình GNU thay thế. Nó không hoàn toàn tách rời quy trình từ thiết bị đầu cuối - Màn hình mô phỏng một vì lợi ích của quy trình - nhưng bạn có thể đính kèm và tách nó khỏi thiết bị đầu cuối thực sự mà bạn đang sử dụng. Bạn thậm chí có thể tách ra một màn hình, đăng xuất, sau đó đăng nhập lại và gắn lại vào cùng một màn hình.