Bash / ZSH: Hoàn tác 'từ chối'


30

Có cách nào để 'gắn lại' một quy trình vào bảng công việc shell sau khi nó đã bị 'từ chối' không?

Chỉnh sửa: $ SEARCHENGINE hoàn toàn làm tôi thất vọng. Có vẻ không tốt lắm.

Câu trả lời:


16

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ế!".


1
Điều này không thể đúng: quá trình cha mẹ không thể khiến đứa trẻ được nhận nuôi ngoại trừ bằng cách thoát ra. Hành vi bạn mô tả phải được kích hoạt từ tiến trình con (hoặc bởi kernel, thực hiện một số điều này một cách tự động nếu cha mẹ chết). Một quá trình không thể nhận nuôi một đứa trẻ một cách tự nguyện nhưng nó cũng không thể từ bỏ.
Gilles 'SO- ngừng trở nên xấu xa'

1
Lời xin lỗi của tôi. Lỗi của tôi. Đơn giản hóa quá nhiều. Chạy qua nguồn bash một lần nữa, bash vẫn giữ quyền sở hữu, nhưng ức chế việc thở dài được truyền lại cho quá trình con. Vì vậy, MIGHT có thể lấy lại, nhưng nó chưa được tích hợp vào bash (chưa). Vì một số lý do, tôi đã bị mắc kẹt trong việc gặt hái những đứa trẻ mồ côi và thây ma.
lornix

@lomix yeah, nhưng khi bạn thoát khỏi shell bạn đã từ chối nó, thì nó sẽ nhận được ppid là 1. vì vậy lý luận của bạn là hợp lệ. người từ chối trừ khi họ định thoát ra bằng mọi cách: p
Orwellophile

1
Xin lỗi, nhưng câu trả lời này là sai. Chỉ cần sử dụng reptyr(xem câu trả lời của tôi cho một ví dụ sử dụng).
Christian Pietsch

18

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).


2
Chà, tôi đã lấy lại quy trình vim bị từ chối của mình với reptyr, vì vậy nó hoạt động giống như tiện ích chưa được biết đến mà tôi đang tìm kiếm.
hlovdal

Bạn đã đúng, @hlovdal: Câu trả lời này là một nửa sai. reptyrlà 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.
Christian Pietsch

11

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

2
. /etc/sysctl.d/10-ptrace.conf "Tôi đã thay đổi giá trị ở cả hai vị trí từ 1 thành 0 và nó đã hoạt động. Tôi đã thử nghiệm một sự từ chối và lặp lại của một quá trình với cùng một người dùng (máy tính xách tay ipython trên ubfox 14.04 LTS). Có lẽ điều này là ổn để phát triển trong một môi trường biệt lập ... tuy nhiên không chắc chắn sự phân nhánh bảo mật cuối cùng của sự thay đổi. Có lẽ ai đó có chuyên môn có thể kêu vang.
FizxMike 4/11/2015

1

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, jobdirsjobtextcá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 SIGSTOPSIGCONTđến quá trình từ chối để mô phỏng Ctrl+ Zbg. Không ai trong số này sẽ khá thuận tiện như sở hữu lại.


0

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.


6
Các trường hợp là: Bạn từ chối quy trình sai và muốn lấy lại.
NISC

1
À. Khó hơn. Màn hình cần phải được báo trước.
Scott
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.