Câu hỏi Làm thế nào để giữ cho các tiến trình chạy sau khi kết thúc phiên ssh?


Giả sử tôi khởi chạy một loạt các quá trình từ một phiên ssh. Có thể chấm dứt phiên ssh trong khi vẫn giữ các tiến trình đang chạy trên máy từ xa không?


507
2017-10-21 12:09


gốc


Liên quan: unix.stackexchange.com/questions/4004/… - Anton Tarasenko


Các câu trả lời:


Bạn nên tìm kiếm các lựa chọn thay thế hiện đại như tmux.

tmux vượt trội hơn screen vì nhiều lý do, đây chỉ là một số ví dụ:

  • Windows có thể được di chuyển giữa phiên và thậm chí được liên kết với nhiều phiên
  • Windows có thể được chia theo chiều ngang và chiều dọc thành các ô
  • Hỗ trợ thiết bị đầu cuối màu UTF-8 và 256
  • Phiên có thể được kiểm soát từ trình bao mà không cần nhập phiên

Chức năng cơ bản

Để có được chức năng tương tự như được giải thích trong câu trả lời giới thiệu screen, bạn sẽ cần phải làm như sau:

  • ssh vào máy từ xa
  • khởi đầu tmux bằng cách gõ tmux vào vỏ
  • bắt đầu quá trình bạn muốn bên trong bắt đầu tmux phiên
  • rời khỏi / tháo rời tmux phiên bằng cách nhập Ctrl+b và sau đó d 

Bây giờ bạn có thể an toàn đăng xuất khỏi máy từ xa, quá trình của bạn sẽ tiếp tục chạy bên trong tmux. Khi bạn quay lại lần nữa và muốn kiểm tra trạng thái của quá trình bạn có thể sử dụng tmux attach đính kèm với tmux phiên.

Nếu bạn muốn có nhiều phiên chạy song song, bạn nên đặt tên cho từng phiên bằng cách sử dụng Ctrl+b và $. Bạn có thể nhận danh sách các phiên hiện đang chạy bằng tmux list-sessions, bây giờ đính kèm vào một phiên chạy với lệnh tmux attach-session -t 0.

tmux có thể làm nhiều điều cao cấp hơn là xử lý một cửa sổ duy nhất trong một phiên duy nhất. Để biết thêm thông tin, hãy xem man tmux hoặc là trang tmux GitHub. Đặc biệt, đây là một câu hỏi thường gặp về sự khác biệt chính giữa screen và tmux.


597
2017-11-23 09:26



@CraigM Use screen -x -r [screenname] hoặc là screen -rx cho ngắn nếu bạn chỉ có một phiên màn hình hoạt động. Điều này cho phép bạn đính kèm một cá thể màn hình hiện có. - Lekensteyn
Lời khuyên này đã giúp tôi với cùng một vấn đề nhưng tôi nghĩ rằng nó bao gồm một lỗi đánh máy. Tôi khá chắc chắn rằng bạn cần phải gõ Ctrl-b và sau đó d để rời khỏi / tháo rời tmux phiên. Chắc chắn đó là trường hợp cho phiên bản của tmux trên Ubuntu 12.04 của tôi. - cxrodgers
Tôi đã mắc lỗi trong khi làm theo các hướng dẫn ở trên. Tôi sẽ chia sẻ nó nếu ai đó có thể rơi vào cùng một sai lầm: Tôi bắt đầu tmux trong vỏ máy tính của riêng tôi thay vì vỏ của máy tính từ xa. Một trong những nhu cầu để bắt đầu tmux trong vỏ của máy tính từ xa. - Mert Nuhoglu
Màn hình hiện đang được phát triển lại: lists.gnu.org/archive/html/screen-devel/2014-04/msg00024.html Bạn có thể cập nhật câu trả lời của mình không? - muru
Ngoài ra, hãy chạy tmux detach thay vì nhập ctrl-b d - Andrew MacFie


Cách tốt nhất thường là đơn giản nhất.

nohup long-running-command &

Nó đã được thực hiện cụ thể cho điều này, nó thậm chí đăng nhập stdout để nohup.log

man nohup

Nếu bạn muốn "nền" một số nhiệm vụ đã chạy, thì đặt cược tốt nhất của bạn là ctrl + z rồi chạy

bg (điều này sẽ làm nền tác vụ bị tạm ngưng gần đây nhất của bạn, cho phép nó tiếp tục chạy)

sau đó nhanh chóng disown nên giữ cho quá trình chạy sau khi bạn đăng xuất.

screen và những người khác có thể làm điều đó, nhưng đó không phải là những gì họ đang làm. Tôi khuyên bạn nên nohup cho các công việc bạn biết bạn sẽ bỏ lại phía sau và bg cho các tác vụ bạn đang chạy và không muốn khởi động lại.

Hãy ghi nhớ, cả hai đều bash cụ thể. Nếu bạn không sử dụng bash, thì các lệnh có thể khác nhau.


217
2017-11-28 02:58



Tôi sẽ khuyên bạn nên làm disown -h - Michele
thú vị màn hình và tmux không hoạt động cho thợ mỏ, bur nohup hoạt động - Yasin Okumuş
bg + disownkhông làm việc cho tôi. Tôi đã có một kịch bản triển khai chạy mà tôi quên bắt đầu bên trong tmux, và cần phải rời khỏi sớm để có một cuộc họp. Kịch bản lệnh liên tục kết quả đầu ra cho trình bao. ctrl+z dừng quá trình, trả lại cho tôi để bash. bg tiếp tục quá trình, nhưng nó cũng tiếp tục xuất hiện tình trạng bash, làm cho nó không thể nhìn thấy những gì tôi đã gõ. Tuy nhiên, một disown lệnh được tạo ra "disown: current: không có công việc như vậy" - BrianHVB


Bạn có thể làm điều đó bằng cách sử dụng screen.

Kiểu man screen để tìm hiểu thêm hoặc đọc màn hình trang người đàn ông.

Kịch bản đơn giản:

  • ssh vào hộp điều khiển từ xa của bạn. Kiểu screen Sau đó bắt đầu quá trình bạn muốn.

  • nhấn Ctrl- -A sau đó Ctrl- -D. Thao tác này sẽ "tách" phiên màn hình của bạn nhưng để các tiến trình của bạn chạy. Bây giờ bạn có thể đăng xuất khỏi hộp điều khiển từ xa.

  • Nếu bạn muốn quay lại sau, hãy đăng nhập lại và nhập screen -r Điều này sẽ "tiếp tục" phiên màn hình của bạn, và bạn có thể thấy đầu ra của quá trình của bạn.


179
2017-10-21 12:20



Tôi thường sẽ đặt tên cho các phiên màn hình của mình bằng cách sử dụng screen -S name để dễ dàng kết nối với đúng sau này. - David Oneill
Liên kết bị gián đoạn - Gab是好人
Cá nhân, tôi đang làm việc trên một hộp mà không cần bất kỳ phần mềm điều khiển gói nào. Sau khi chi tiêu khoảng nửa giờ xây dựng phụ thuộc cho TMUX (mà cá nhân tôi có kinh nghiệm với và thích) từ nguồn, nó trở nên rõ ràng rằng màn hình là giải pháp tốt hơn và đơn giản hơn cho tôi. TL; DR: giải pháp tối ưu cho vấn đề này phụ thuộc vào trường hợp sử dụng, máy và thời gian bạn phải thiết lập. Cảm ơn câu trả lời này :) - Max von Hippel
Kết hợp với screen -S trước khi đi và screen -r khi trở lại thật tuyệt vời! - Meloman
Cám ơn vì cái này. Giải pháp này làm việc cho tôi trong khi tmux không (tôi sử dụng một phiên bản bash cho các cửa sổ trong khi ssh'ing vào một máy linux) - Michael Sorensen


Màn hình và nohup là cách tốt hơn, nhưng nếu bạn phải tách một tiến trình đã chạy mà không có màn hình hoặc nohup, bạn có thể chạy lệnh disown.

disown [-ar] [-h] [jobspec… |pid… ]

Không có tùy chọn, hãy xóa từng tùy chọn jobspec từ bảng công việc đang hoạt động. Nếu -h tùy chọn được đưa ra, công việc không được xóa khỏi bảng, nhưng được đánh dấu sao cho SIGHUP không được gửi đến công việc nếu trình bao nhận được SIGHUP. Nếu jobspec không có mặt, và cả -a cũng không phải -r tùy chọn được cung cấp, công việc hiện tại được sử dụng. Nếu không jobspec được cung cấp, -a tùy chọn có nghĩa là xóa hoặc đánh dấu tất cả các công việc; các -r tùy chọn mà không cần jobspec đối số hạn chế hoạt động để chạy công việc.

Với disown bạn có thể đóng terminal và nhận được quá trình đang chạy trên máy.


72
2017-10-21 13:19



Đây cũng là cách yêu thích của tôi để làm điều đó. Tôi thường xuyên sử dụng disown -a && exit - Stefano Palazzo♦
Hoàn hảo. Đây là một lệnh đáng yêu và xứng đáng với tất cả các upvotes! - Greg
một lời cảnh cáo, tôi đã dừng quá trình đang chạy với Ctrl-Z và không khởi động nó trong nền trước khi gọi disown và nó đã giết nó. - HDave
Có thể gặp sự cố nếu muốn ghi vào thiết bị đầu cuối. Chuyển hướng đầu ra của một tiến trình đang chạy không dễ dàng như vậy. Tốt hơn để bắt đầu nó đúng với nohup. - jiggunjer
Đây là một câu trả lời hay, bởi vì nó trả lời trực tiếp câu hỏi. Tác giả của câu hỏi đã hỏi phải làm gì sau đã thực hiện một loạt các lệnh chạy dài. Hầu hết các câu trả lời này cho bạn biết phải làm gì trước bạn thực hiện các lệnh. - q0rban


Tôi đã bị mắc kẹt trong một mv lớn vì vậy tôi đã không ở trong một vị trí để ngăn chặn quá trình, thiết lập màn hình và sau đó bắt đầu lại. Tôi quản lý để thoát khỏi phiên ssh với quá trình chạy bằng cách chủ yếu làm các bước sau:

  1. ssh [server]
  2. chỉ huy
  3. CTRL + Z
  4. bg
  5. bị tước đoạt
  6. lối thoát

Bước 3 tạm dừng quá trình hiện tại (ví dụ: lệnh 'mv' của tôi). Bước 4 đặt quá trình tạm dừng vào nền và tiếp tục lại. Bước 5 cho phép bạn loại bỏ quá trình.


37
2017-11-25 03:30



Tích hợp luôn là lựa chọn đầu tiên của tôi :) THX - ken_oy
Câu trả lời này phải được đánh dấu là đúng. Để cài đặt và làm quen với màn hình để giải quyết vấn đề này được phóng đại. - Ulrich-Lorenz Schlüter
Điều này rất hữu ích khi bạn đã bắt đầu bất kỳ lệnh nào và đang chạy trong thời gian dài. Chấm dứt và bắt đầu nó trong một phiên TMUX sẽ mất thời gian - Deepali Mittal


Có hai chương trình chính bạn có thể sử dụng để duy trì các chương trình và trạng thái thiết bị đầu cuối qua nhiều kết nối ssh. Họ là màn hình (đương nhiệm, nhưng tiếc là không chắc chắn. đang được tích cực phát triển) và tmux (mới hơn, chủ động được duy trì). Byobu là một giao diện người dùng có thể chạy trên các hệ thống này và cung cấp thêm thông tin trạng thái ubuntu. Khi cài đặt mới, nó sẽ sử dụng tmux như một backend, nếu bạn cài đặt byobu cũ hơn và cấu hình hiện tại, nó sẽ duy trì backend trước đó, có thể là màn hình hoặc tmux.

Byobu

Byobu có thể được cài đặt trên máy tính bằng cách làm như vậy trong máy dựa trên Debian:

sudo aptitude install byobu

Sử dụng yum, bạn làm

su -c 'yum install byobu'

Cũng có thể cài đặt byobu trên các bản phân phối khác.

Sử dụng byobu

Bạn có thể bắt đầu byobu bằng cách chạy byobu trên máy chủ sau khi kết nối bằng ssh. Điều này sẽ cung cấp cho bạn một vỏ trông như thế này:

image-byobu

Bạn cũng có thể sử dụng Byobu Terminal trên máy Ubuntu với tùy chọn -X và dễ dàng có một byobu hoạt động hoàn hảo.

Sử dụng:

Bắt đầu byobu bằng cách nhập byobu.

Bạn có thể nhấn F2 để tạo cửa sổ mới trong phiên hiện tại, F3-F4 để chuyển đổi giữa các cửa sổ khác nhau.

Phần tốt nhất về byobu là, bạn không phải thực sự giết các tiến trình đang chạy trong terminal để rời khỏi terminal. Bạn có thể chỉ cần gửi màn hình / tmux (bộ khung của byobu) đến nền và tiếp tục vào lần tiếp theo bạn đến:

  • Để lại byobu và keeep nó chạy (tách) nhấn F6.
  • Lần tới khi bạn đến, chỉ cần làm byobu và bạn sholud được trở lại ngay nơi bạn đang có.

    byobu-detach-attach

Bạn cũng có thể tạo các phiên byobu khác nhau theo byobu -S session1 và vân vân. Và bạn có thể kết nối với một trong hai người đó khi bạn quay lại.

Bạn có thể làm nhiều hơn bằng cách sử dụng Byobu. Sử dụng nó! Một số hướng dẫn dứt khoát là đây, đây hoặc là đây.


19
2017-11-24 22:09



Tôi đã thử sử dụng byobu từ một phiên dựa trên PuTTY vào hộp Ubuntu của tôi, nhưng tôi nhận được dòng trạng thái lặp lại và cuộn trên màn hình. Mặc dù nó tách ra đúng cách wen nhấn F6, nó không phải là một giải pháp có thể sử dụng trong thiết lập của tôi. - jfmessier
@jfmessier Đó là bởi vì PuTTY không có ncurses (utf-8 về cơ bản) tốt. Có thể loại bỏ vấn đề này bằng cách làm theo chủ đề này - stackoverflow.com/questions/10731099/… - SiddharthaRT
Điều này thật tuyệt! 1. nó mang lại cho tôi một dấu nhắc bash màu mà tôi dường như không thể kích hoạt với bash như shell mặc định của tôi và 2. Tôi nhận được để chạy 2 chương trình cùng một lúc và vẫn có một thiết bị đầu cuối khác để thực hiện công việc! @SiddharthaRT bạn xứng đáng là một upvote sir! - Dev


Bạn không thể làm điều này khi quá trình đã bắt đầu, bạn cần phải thiết lập mọi thứ trước khi chạy một công việc dài.

Bạn có thể dùng nohup nhưng trí tuệ hiện đại cho thấy bạn sử dụng màn hình hoặc byobu làm thông tin đăng nhập của bạn để bạn có thể tách rời và để mọi thứ hoạt động.

Màn hình có lợi thế là bạn có thể tách ra khỏi một máy và gắn lại từ một máy khác, điều này rất tiện lợi nếu bạn muốn kiểm tra các quy trình chạy dài vượt quá thời gian cuối ngày làm việc.

Có một sự khởi đầu hợp lý hướng dẫn đến màn hình đây.

byobu đặt một giao diện dễ sử dụng trên đầu màn hình với các menu vv Nó cũng là việc thực hiện màn hình hiện tại trên ubuntu mới hơn. F2 để bắt đầu một thiết bị đầu cuối mới F3 / F4 để chuyển đổi qua lại và F6 để ngắt kết nối. Loại thoát để thực sự kết thúc thiết bị đầu cuối vĩnh viễn.


16
2017-10-21 12:16



byobu sử dụng tmux những ngày này .. - scottl
"Bạn không thể làm điều này khi quá trình đã bắt đầu, bạn cần phải thiết lập mọi thứ trước khi chạy một công việc dài." - không, bạn có thể sử dụng disown để đạt được điều này. Xem câu trả lời của @ bassgey - Rich
sau khi đấu tranh để học màn hình và tmux .... byobu mang nước mắt đến mắt tôi - HDave
disown và nếu cần Ctrl-z, sau đó bg để có được nó của các thiết bị đầu cuối hoạt động và nền. Sau đó, disown. - mimoralea


Này, trong khi tôi đồng ý màn hình đó là lựa chọn tối ưu nhất. Bạn có thể sử dụng vncserver và sau đó bắt đầu quá trình trên nó.

Ngoài ra, nếu giao tiếp duy nhất của bạn là có quá trình chạy và không cần kiểm soát lại, và hoàn toàn quan trọng nhất bạn không biết bạn sẽ cần phải đóng phiên và bạn đã có quá trình chạy, bạn sẽ không may mắn nếu bạn đã sử dụng bash làm vỏ

Trước tiên, bạn cần gửi quá trình này sang nền bằng cách nhấn Ctrl + Z theo sau là bg% 1 (số phụ thuộc vào số công việc, thường là 1, nhưng bạn có thể dễ dàng kéo danh sách bằng lệnh)

Cuối cùng gọi lệnh đã bị hủy bỏ (theo sau là jobid ... giống như lệnh bg)

Điều này sẽ loại bỏ mối quan hệ cha-con giữa vỏ của bạn và quá trình trong nền, ngăn chặn nó chết khi vỏ của bạn bị chấm dứt.


7
2018-06-06 21:29



Câu trả lời này là tốt nhất! Tại sao mọi người lại nói về screen, câu hỏi đã được đặt ra sau sự kiện đăng nhập, làm thế nào để giữ cho các tiến trình đang chạy, bây giờ sau khi đăng nhập nhưng trước khi bắt đầu chúng. Câu trả lời tuyệt vời Jorge, anh thực sự đã giúp tôi! :) - jwbensley
Đơn giản bg (không có %1) thường là đủ, vì mặc định là công việc hiện tại - Walter Tross
Nó sẽ là tốt đẹp để có một câu trả lời toàn diện: Một ưu tiên (thiết lập trước): màn hình thiết bị đầu cuối ascii (cũ), tmux (neewer); Cửa sổ X: vnc (cũ, vẫn được duy trì), xpra (mới hơn), với xpra không root. Một hậu duệ (bền bỉ sau khi bạn bắt đầu): ^ Z, bị tước bỏ, ... Nhưng tôi quá lười biếng để ăn thịt nó nhiều hơn thế này. - Krazy Glew