Di chuyển một chương trình bắt đầu trong màn hình GNU ra một thiết bị đầu cuối khác


21

Tôi muốn chấm dứt một thể hiện của GNU screentrong khi bảo toàn tiến trình đang chạy bên trong nó.

Vì vậy, tôi đã mở chương trình giả lập thiết bị đầu cuối thông thường của mình và màn hình thực thi. Sau đó, tôi đã sử dụng ví dụ đó screenđể thực thi ./script_x.sh. Bây giờ, vì bất kỳ lý do gì, tôi muốn bỏ sử dụng screentuy nhiên script_x.shvẫn chưa hoàn thành nhiệm vụ của mình và tôi không sẵn sàng để mất tiến trình của mình.

Tôi có thể giữ quá trình hoạt động để tiếp tục làm việc với nó trong trình giả lập thiết bị đầu cuối thông thường của mình không?


14
Bạn có thực sự muốn giết màn hình hoặc bạn muốn tách ra khỏi nó? Màn hình có nghĩa là được sử dụng để chạy một quá trình trong nền để bạn có thể tiếp tục trong phiên thông thường của mình, nó cũng cho phép các ứng dụng tiếp tục chạy sau khi bạn đăng xuất (ví dụ: ngắt kết nối phiên SSH của bạn). Bạn luôn có thể tách ra khỏi màn hình, tiếp tục trong phiên thông thường và chọn nơi bạn đã rời khỏi phiên màn hình. Trình giả lập thiết bị đầu cuối của bạn không có gì để làm với điều này.
BlueCacti 18/03/2016

Hoặc chỉ cần tạo một màn hình khác trong screenphiên.
chrylis -on đình công-

11
Câu hỏi này có mùi giống như vấn đề XY .
Kỹ thuật số Chris

7
@ tjt263 - bạn nói rằng bạn hối tiếc khi sử dụng màn hình ở nơi đầu tiên, vậy bạn sẽ làm gì để duy trì quá trình của mình nếu bạn không sử dụng màn hình? Bạn vẫn có thể làm điều tương tự với quy trình trong màn hình, nhưng màn hình có thêm lợi thế là bạn có thể tách ra khỏi nó và để quá trình của bạn chạy không bị xáo trộn.
Johnny

@DigitalChris Nó có thể làm ngay bây giờ. Tôi cảm thấy như tiêu đề ban đầu có lẽ phù hợp hơn. Có 3 điểm khác biệt: Tôi đang chạy một chương trình bên trong screen. Tôi muốn ngừng sử dụng screen. Tôi không muốn dừng chương trình đang chạy bên trong screen. Đó là nó. Tôi không biết làm thế nào để làm rõ tình huống hoặc diễn đạt nó đơn giản hơn thế này.
lên tiếng vào

Câu trả lời:


31

TLDR: Câu trả lời thực tế: Không.

Câu trả lời dài hơn:

Về lý thuyết bạn có thể. Nếu bạn bắt đầu một cái gì đó như nohup myprog &từ bên trong màn hình thì nó sẽ tiếp tục chạy. Nó sẽ bỏ qua tín hiệu gác máy và sẽ không có bất kỳ đầu vào nào, nhưng trong lượng calo bạn có thể tiếp tục làm việc với nó.

Trong thực tế đây không phải là trường hợp. Do đó, trừ khi bạn muốn đính kèm trình gỡ lỗi vào quy trình đang chạy và viết lại tay cầm tệp của nó và đảm bảo rằng quy trình xử lý tín hiệu -1 khi bạn đóng màn hình ... thì câu trả lời là không.

Nếu bạn đã sẵn sàng để làm điều này, tôi có một dấu trang ở nhà chỉ vào [SU] nơi ai đó đã làm điều đó . Tiết kiệm cho sự tuyệt vời, không phải vì nó dễ dàng và tầm thường để làm.


Lưu ý rằng câu hỏi đã được chỉnh sửa ồ ạt kể từ câu trả lời của bạn.
chrylis -on đình công-

Việc ngắt kết nối một quy trình khá đơn giản - đó là câu hỏi về việc thiết lập các nhóm quy trình (có disownhoặc ở mức thấp hơn) để không SIGHUPgửi đi khi quy trình cha bị chết. Kết nối lại i / o là một điều khác hoàn toàn-- đó là nơi trình gỡ lỗi xuất hiện.
alexis

Bạn không cần nohupnếu bạn đang ở trong một vỏ điều khiển công việc (như bash, ksh, csh, zsh, ash, vv). Nếu bạn vẫn đang sử dụng trình điều khiển phi công việc như Bourne, shcó lẽ đã đến lúc nâng cấp.
gà con

23

Bạn có thể thử sử dụng reptyrđể gắn lại ứng dụng đã chạy vào thiết bị đầu cuối khác nhau. Nó có một số vấn đề với quá trình gửi đến nền, mặc dù.

Tôi vừa thử nó (bắt đầu từ htopbên trong screen, reptyrđến một thiết bị đầu cuối khác, giết screen), và nó dường như hoạt động ổn. Tuy nhiên, đây vẫn là một giải pháp thực sự khó khăn, vì vậy không có gì đảm bảo.


1
Ít hack hơn sử dụng gdb :)
Hennes

14

Có (nếu "giết" không thực sự giết), đó thực sự chính xác là màn hình dành cho. Bạn nên kiểm tra hướng dẫn và thử xem một trong những điều này phù hợp với nhu cầu của bạn:

C-a d
C-a C-d     (detach)      Detach screen from this terminal.

C-a D D     (pow_detach)  Detach and logout.

Sau đó, những gì bạn sẽ cần là các tùy chọn dòng lệnh -D / -d -R / -r của màn hình, tùy thuộc vào sự lựa chọn của bạn.


1
Điều này không trả lời câu hỏi. OP không muốn tách ra khỏi màn hình, họ muốn chấm dứt quá trình màn hình.
Guntram Blohm hỗ trợ Monica

6
Vâng, anh ấy đã viết nó nhưng tôi không chắc anh ấy đã hỏi anh ấy muốn gì.
Gombai Sándor

11
@GuntramBlohm Không rõ ràng là OP hiểu cách hoạt động của màn hình và đây là hiệu ứng mong muốn nhất.
chrylis -on đình công-

2
Bạn có biết rằng màn hình không phải là một thiết bị đầu cuối khác với xterm mà là một lớp (thiết bị đầu cuối giả) có thể được gắn vào thiết bị đầu cuối thực của bạn (vterm, xterm, terminator, (m) rxvt, bất kỳ) sau khi tách nó khỏi bất kỳ thiết bị đầu cuối nào khác? Và màn hình là thứ giúp cho quá trình của bạn chạy một khi bạn khởi động nó bên trong màn hình (và nó hoạt động tốt). Nếu bạn giết (thực sự giết) màn hình, sau đó bạn kéo tấm thảm ra theo quy trình của bạn ... Tôi chỉ không thấy bất kỳ lý do chính đáng nào tại sao bạn lại làm như vậy.
Gombai Sándor

1
@ GombaiSándor: Một lý do để muốn làm điều đó là làm cho quá trình nói chuyện trực tiếp với một thiết bị đầu cuối để vượt qua các khả năng mà màn hình không biết đến. Ví dụ, tôi đã từng hack phiên bản xterm của riêng mình để làm cho tất cả các phím chức năng kỳ lạ trên bàn phím của tôi gửi các chuỗi thoát bao gồm các phím X11 và trạng thái sửa đổi đầy đủ, thay vì cố gắng giả vờ đó là VT102 - và sau đó bắt đầu cài đặt keybindings cho họ trong emacs. Những chuỗi đó sẽ không đi qua màn hình.
Henning Makholm 19/03/2016
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.