Làm thế nào tôi có thể đóng một thiết bị đầu cuối mà không giết chết con của nó (mà không chạy `màn hình 'trước)?


35

đôi khi tôi chạy một ứng dụng trong gnome-terminal, nhưng sau đó tôi đột nhiên phải khởi động lại gnome hoặc một cái gì đó. Tôi đoán câu trả lời cho câu hỏi cũng hữu ích sau đó tôi muốn ngắt kết nối khỏi SSH, nơi có điều gì đó đang xảy ra.

Cây đầu cuối của Gnome trông như thế này:

gnome-terminal
    bash
        some-boring-process

Tôi có thể 'tách' bashkhỏi gnome-terminal(hoặc tách some-boring-processkhỏi bash và chuyển hướng đầu ra của nó ở đâu đó không)? Nếu tôi giết gnome-terminal, bashsẽ bị giết tất cả các quy trình con của nó


Câu trả lời:


48

Nếu some-boring-processđang chạy trong phiên bash hiện tại của bạn:

  1. tạm dừng nó ctrl-zđể cung cấp cho bạn dấu nhắc bash
  2. đặt nó trong nền với bg
  3. lưu ý số công việc, hoặc sử dụng jobslệnh
  4. tách quá trình từ phiên bash này bằng disown -h %1(thay thế số công việc thực tế ở đó).

Điều đó không làm gì để chuyển hướng đầu ra - bạn phải nghĩ về điều đó khi bạn khởi chạy quy trình nhàm chán của mình. [Chỉnh sửa] Dường như có một cách để chuyển hướng nó https://gist.github.com/782263

Nhưng nghiêm túc, nhìn vào màn hình. Tôi có shell trên một máy chủ từ xa đã chạy trong nhiều tháng.


Cảm ơn bạn. Tôi đã chọn câu trả lời của bạn vì đó là câu duy nhất trả lời câu hỏi (đó là về quá trình đã chạy). screenĐôi khi tôi đã sử dụng , mặc dù nó có vấn đề và tôi không muốn sử dụng nó cho mỗi phiên bash trong cuộc sống của mình
valya

Bạn không sử dụng nó cho mỗi phiên bash, nhưng đối với mọi máy từ xa mà bạn dành nhiều thời gian.
glenn jackman

Tôi đã tự do thêm thông tin về việc chuyển hướng đầu ra, xin vui lòng xem lại!
valya

[root @ server ~] # bg -bash: bg: current: không có công việc như vậy
Muhammad Dyas Yaskur

Tại sao tôi có bash: bg: current: no such job?
Muhammad Dyas Yaskur

10

Đây chính xác là những gì màn hìnhtmux đã được tạo ra. Bạn chạy shell bên trong phiên màn hình / tmux và bạn có thể ngắt kết nối / kết nối lại theo ý muốn. Bạn cũng có thể có nhiều phiên shell chạy bên trong một gnome-terminal.


Cảm ơn, nhưng, như tôi đã nhận xét cho câu trả lời được chấp nhận: 1. câu hỏi là về quá trình đã chạy. 2. screencó vấn đề của nó và tôi không cảm thấy muốn sử dụng nó cho mỗi phiên bash trong cuộc sống của mình
valya

6

screen, tmuxhoặc dtach(có thể với dvtm) đều tuyệt vời cho việc này, nhưng nếu đó là thứ mà bạn không nghĩ sẽ sử dụng một trong những thứ đó, bạn có thể tận dụng nohup.


Cảm ơn, nhưng, như tôi đã nhận xét cho câu trả lời được chấp nhận: 1. câu hỏi là về quá trình đã chạy. 2. screencó vấn đề của nó và tôi không cảm thấy muốn sử dụng nó cho mỗi phiên bash trong cuộc sống của mình
valya

@valya Vui mừng bạn đã tìm thấy một giải pháp. Tuy nhiên, để rõ ràng, nohuphoạt động trên một quy trình đang chạy bằng cách sử dụng -ptùy chọn (nếu có).
Hank Gay

@Hank Gay: Tôi không thể thấy -ptùy chọn nohuptrong trang nam; bạn đang ở hệ thống nào
Mikel

@Mikel Trước khi tôi học cách ngừng lo lắng và yêu thích tmux, tôi đã sử dụng -ptùy chọn trên hộp Solaris. Tôi cũng có những ký ức mơ hồ khi thực hiện nó trên hộp CentOS mongrel (có thể zshcó một nội dung hỗ trợ cho nó?), Nhưng tôi không thể tìm thấy bất kỳ tài liệu nào về điều đó.
Hank Gay

@Hank Gay: Cả hệ thống Ubuntu Linux của tôi bashcũng không zshcung cấp nohup.
Mikel

4

Nếu bạn muốn tiếp tục tương tác với quá trình con thay vì chỉ làm nền và tiếp tục thực hiện, thì thực sự có một chương trình gọi là retty , đó là một bằng chứng về việc "đánh cắp" một quá trình từ tty hiện tại của nó và gắn lại nó vào hiện tại.

Tuy nhiên, nó thực hiện một số điều khủng khiếp, bao gồm việc dán một số mã lắp ráp vào ngăn xếp của ứng dụng được đính kèm lại. Và mã đó chưa được cập nhật cho x86_64.

Có một chương trình khác có cách tiếp cận có thể tốt hơn, đóng băng quá trình trong không gian người dùng vào một tệp, từ đó nó có thể được khôi phục (có thể trên một tty khác.) Đây là cryopid và dự án đó dường như đã dừng lại trong giai đoạn bằng chứng khái niệm và không hoạt động với Linux hiện đại như mã đứng. À

Chỉ cần nghĩ rằng điều này nên ở đây cho đầy đủ. Nếu bạn không bận tâm đến việc sử dụng voodoo khủng khiếp, thì đây là khả năng - ít nhất là khả năng lý thuyết.


1
điều đó làm tôi nhớ đến gist.github.com/782263 ... oh, ý chính đó dường như cũng trả lời câu hỏi của tôi
valya

2

Nếu tôi kích hoạt thứ gì đó mà tôi muốn hoàn thành bất kể điều gì (thiếu khởi động lại hệ thống), tôi sử dụng nohupvà chạy nó trong nền. Không giống như màn hình và những thứ tương tự bạn không thể gắn lại vào các quy trình. Tuy nhiên, chuyển hướng baring ở bất kỳ nơi nào khác có thể được tìm thấy trong nohup.out.

Tôi sử dụng screenkhi tôi muốn có thể chuyển đổi thiết bị đầu cuối cho một quá trình. Chẳng hạn như bắt đầu một quá trình từ nhà / công việc và chuyển sang khác. Giống như bất kỳ đầu ra phiên cuối khác sẽ cuối cùng cuộn ra khỏi đầu bộ đệm.

EDIT: Nếu bạn đã khởi chạy quy trình, bạn có thể disownxử lý để ngăn HUPtín hiệu được gửi khi quá trình đóng.


Cảm ơn, nhưng, như tôi đã nhận xét cho câu trả lời được chấp nhận: 1. câu hỏi là về quá trình đã chạy. 2. screencó vấn đề của nó và tôi không cảm thấy muốn sử dụng nó cho mỗi phiên bash trong cuộc sống của mình
valya

@valya Tôi đã thấy các tài liệu tham khảo để ngắt kết nối một quy trình đang chạy khỏi nhóm chương trình. Tôi không biết bất kỳ công cụ để làm như vậy mặc dù. Công cụ có thể sẽ cần phải chuyển hướng các kênh IO std. Tôi nghĩ rằng tôi có thể đã làm cho nó hoạt động một lần, nhưng quyết định nohup đơn giản hơn.
BillThor

1

Bạn có thể làm cho quá trình (PID) không nhận được tín hiệu HUP khi phiên cuối kết thúc. Sử dụng lệnh sau:

nohup -p PID

nohup: invalid option -- 'p'. Phiên bản nohupnào bạn đang chạy trên loại hệ thống nào?
Anthon

Tôi chủ yếu sử dụng Solaris và AIX. Đối với Linux, bạn nên kiểm tra lệnh disown.
tony

Vâng, không có -ptùy chọn nào trên Linux, vì vậy câu trả lời này là Solaris và AIX cụ thể. Điều tốt để biết mặc dù
Sergiy Kolodyazhnyy

1

Kịch bản lệnh này tách quá trình con khỏi cha mẹ và gán nó cho quá trình init :

toDetach=$1

./$toDetach & # Runs the process - script on background

disown -h %$(jobs -l | grep $(ps -A | grep $toDetach | cut --delimiter=' ' -f1) | cut --delimiter=' ' -f1 | tr -d '[]+') # and then disowns it from parents process
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.