it-swarm-vi.com

Làm cách nào tôi có thể từ chối một quy trình đang chạy và liên kết nó với một vỏ màn hình mới?

Tôi có một chương trình đang chạy trên SSH Shell. Tôi muốn tạm dừng nó và có thể bỏ tạm dừng việc thực hiện nó khi tôi quay lại.

Một cách tôi nghĩ để làm điều đó là chuyển quyền sở hữu của nó sang Shell màn hình, do đó giữ cho nó chạy trong đó.

Có một cách khác để tiến hành?

164
levesque

Sử dụng GNU screen là đặt cược tốt nhất của bạn.

Màn hình bắt đầu chạy khi bạn đăng nhập lần đầu - Tôi chạy screen -D -R, chạy lệnh của bạn và ngắt kết nối hoặc tạm dừng nó với CTRL-Z và sau đó ngắt kết nối khỏi màn hình bằng cách nhấn CTRL-A sau đó D.

Khi bạn đăng nhập lại vào máy, kết nối lại bằng cách chạy screen -D -R. Bạn sẽ ở trong Shell giống như trước đây. Bạn có thể chạy jobs để xem quy trình bị treo nếu bạn đã làm như vậy và chạy %1 (hoặc công việc tương ứng #) để báo trước nó một lần nữa.

88
Andrew Yochum

Bạn có thể thu hồi quyền sở hữu của người dùng trên chương trình từ Shell với disown tích hợp:

# press Ctrl+Z to suspend the program
bg
disown

Tuy nhiên, điều này chỉ yêu cầu Shell không gửi tín hiệu SIGHUP đến chương trình khi Shell thoát. Chương trình sẽ giữ lại bất kỳ kết nối nào với thiết bị đầu cuối, thường là các luồng đầu vào, đầu ra và lỗi tiêu chuẩn. Không có cách nào để gắn lại những thứ đó đến một thiết bị đầu cuối khác. ( Màn hình hoạt động bằng cách mô phỏng thiết bị đầu cuối cho mỗi cửa sổ, vì vậy các chương trình được gắn vào cửa sổ màn hình.)


Có thể gắn lại các trình biên dịch vào một tệp khác bằng cách đính kèm chương trình trong trình gỡ lỗi (nghĩa là sử dụng ptrace ) và gọi nó là open, dupclose. Có một vài công cụ làm điều này; đây là một quá trình khó khăn và đôi khi họ sẽ phá vỡ quy trình thay thế. Các khả năng bao gồm (các liên kết được thu thập từ các câu trả lời đến Làm cách nào tôi có thể từ chối một quy trình đang chạy và liên kết nó với một vỏ màn hình mới?Tôi có thể Nohup/sàng lọc một quy trình đã bắt đầu không? =):

116

Để di chuyển một quá trình giữa các thiết bị đầu cuối hoặc gắn lại một từ chối, bạn có thể sử dụng, ví dụ: reptyr .

67
jofel

Giải pháp yêu thích của tôi là sử dụng tmux, bạn có thể tách phiên và gắn lại vào thiết bị đầu cuối khác.

Khi bạn tách ra từ phiên trước, bạn có thể đóng thiết bị đầu cuối một cách an toàn; sau này sử dụng tmux attach để quay lại phiên, ngay cả khi bạn đã đăng xuất.

28
daisy

Ngoài ra còn có một tiện ích nhỏ gọi là retty cho phép bạn gắn lại các chương trình đang chạy sang thiết bị đầu cuối khác.

21
adamg

Tôi không sử dụng nó thường xuyên, nhưng neercs yêu cầu hỗ trợ này. Đó là một chương trình screen- với các tính năng ưa thích linh tinh như quản lý khung tốt hơn, nhưng điều chính nó cung cấp là khả năng nhập một quy trình vào một khung

19
Michael Mrozek

Nếu bạn chỉ muốn tạm dừng nó và khởi động lại sau đó, bạn có thể sử dụng tín hiệu kill với STOP hoặc CONT.

Đầu tiên hãy tìm hiểu các quy trình PID với

$ ps aux

Sau đó gửi các tín hiệu đến PID đó được liệt kê cho quá trình

$ kill -STOP <PID>

$ kill -CONT <PID>
9
yunzen

"Tiêm mã" từ ThomasHabets dường như chính xác là thứ tôi cần:

https://github.com/ThomasHabets/injcode

Chương trình mã hóa cho phép nhập mã tùy ý vào quy trình đang chạy, cho dù bạn có biết trước hay không và đang chạy màn hình hoặc tmux

Từ README:

Ví dụ 1: di chuyển irssi từ thiết bị đầu cuối này sang thiết bị đầu cuối khác

Có lẽ di chuyển nó vào một màn hình.

Đầu tiên bắt đầu irssi trong một thiết bị đầu cuối.

Chạy phần mềm trong một thiết bị đầu cuối khác: $ tiêmcode -m retty

Irssi bây giờ nên được chuyển đến thiết bị đầu cuối thứ hai, bao gồm cả thiết bị đầu cuối kiểm soát mới.

9
user2688272

Điều này làm việc cho tôi:

  1. bg quá trình
  2. jobs -l tìm số quy trình
  3. tmux bắt đầu trình quản lý cửa sổ Shell
  4. reptyr -L PROCESSNUMBER

reptyr 's -L là cần thiết để làm việc này:

-L Like '-l', but also redirect the child's stdio to the slave.

vì lỗi này:

$ reptyr 30622

[-] Unable to open the tty in the child.
Unable to attach to pid 30622: Permission denied

Và với -L

$ reptyr -L 30622
Opened a new pty: /dev/pts/4
1
kqw