Ngăn chặn hiện đang chạy tác vụ linux bị giết sau khi đăng xuất khỏi SSH


18

Tôi có một tác vụ tính toán chạy trong vài ngày trên máy chủ linux thông qua kết nối SSH. Nó không ở trên nền, vì vậy kết nối SSH đang bị mất nhiệm vụ.

Tôi muốn khởi động lại máy cục bộ (không phải máy chủ) mà tôi đã mở phiên ssh, nhưng muốn duy trì hoạt động. Có khả năng nào không?

Câu trả lời:


22

Nếu nhiệm vụ của bạn đã được đưa ra, đó là quá muộn *để xem xét các giải pháp thay thế mà chèn thêm một lớp giữa của bạn sshphiên và vỏ cách chạy lệnh, giống như screen, tmux, byobu, nohupvà thích.

Nếu hỗ trợ quy trình của bạn được đặt trong nền và đặc biệt là không treo khi nào stdoutstderrkhông thể ghi / đóng, bạn có thể đặt nó ở chế độ nền trước khi đăng xuất ControlZbgsau đó tách nó ra khỏi vỏ của bạn với phần disowndựng sẵn.

ví dụ:

$ ssh localhost
You have new mail.
Last login: Fri Jun  6 11:26:56 2014

$ /bin/sleep 3600    


^Z[1] + Stopped                  /bin/sleep 3600
$ bg
[1] /bin/sleep 3600&
$ jobs
[1] +  Running                 /bin/sleep 3600
$ disown %1
$ exit
Connection to localhost closed.
$ ps -ef|grep sleep
jlliagre 12864     1  0 21:12 ?        00:00:00 /bin/sleep 3600
jlliagre 13056 12477  0 21:13 pts/18   00:00:00 grep sleep
$ 

*Như Bob đã nhận xét, thực sự có một số cách hackish để sửa chữa một phiên tty trong Linux. repty, retty , tiêm mãneercs . Phiên bản tiên tiến nhất có vẻ là reptyr nhưng bạn có thể cần quyền root để kích hoạt ptrace để hack tiến trình của bạn.


Tôi đã sử dụng Ctrl + Z, công việc dừng lại và chuyển sang nền, sau đó thực hiện disownlệnh. Nó trả về: bash: cảnh báo: xóa công việc đã dừng 1 với nhóm quy trình 24876. Bây giờ công việc của tôi được liệt kê ps -allnhưng dường như không hoạt động (mức sử dụng CPU là 0%)
Ali

Có vẻ như quá trình của tôi bị dừng lại. Tôi đoán tôi nên cung cấp ID proces với disownlệnh
Ali

@Ali Tôi nghĩ bạn đã quên chạy lệnh bg để tiếp tục công việc bị đình chỉ.
Jason Zhu

1
@JasonZhu Cảm ơn bạn đã chỉ ra điều đó. Không rõ bglệnh được yêu cầu trong phần đầu tiên của câu trả lời của tôi. Đã chỉnh sửa.
jlliagre

2
Nếu bạn quên lệnh bg và chỉ chạy lệnh disown, bạn sẽ có thể có được quy trình chạy lại với quy trình kill -CONTgần giống như bg.
kasperd

5

Một giải pháp là sử dụng màn hình GNU . Bạn có thể khởi động screen, chạy lệnh của bạn, sau đó tách ra C-a d. Sau đó, để kết nối lại, làm screen -rvà bạn quay lại phiên trước đó.

Các lợi ích khác của màn hình là quản lý cửa sổ (vì vậy bạn có thể chuyển sang các shell khác trong khi lệnh của bạn đang chạy mà không cần kết nối SSH mới) và nó cho phép lệnh của bạn duy trì ở phía trước, cho dù trong phiên hiện tại hay sau này.

Chỉnh sửa: Như đã lưu ý trong các nhận xét, điều này sẽ chỉ hoạt động nếu bạn nhớ bắt đầu screentrước khi chạy lệnh. Nếu lệnh đã chạy, thì bạn sẽ cần giải pháp của @ jlliagre.


2
tmuxlà một chương trình khác giống như screenvậy cho phép bạn có một phiên từ xa không gắn với kết nối SSH hiện tại của bạn.
Darth Android

2
Giải pháp của bạn là tuyệt vời. Tuy nhiên, nó không hoàn toàn phù hợp với câu hỏi của tôi - Tôi đã hỏi về quy trình hiện đang chạy, không phải là quy trình sẽ được chạy trong tương lai screen.
Ali

À được rồi. Trong trường hợp đó, tôi nghĩ bạn sẽ cần sử dụng giải pháp của @ jlliagre. (Theo như tôi biết, không có cách nào để kết nối một quy trình đã chạy với một cái gì đó như screenhoặc tmux.)
Scott Weldon

1

Một trong những cách "tiêu chuẩn" để làm như vậy, là sử dụng nohuplệnh, được bao gồm trong coreutils, như thế này:

nohup COMMAND [ARGS] &

Nhưng lệnh sẽ chuyển hướng đầu ra ( STDOUT& STDERRAFAIK) của chương trình thành một tệp nohup.out, đôi khi gây khó chịu đôi khi (như tạo tệp nhật ký lớn), vì vậy bạn có thể muốn thực hiện chuyển hướng của riêng mình hoặc chuyển hướng đến / dev / null nếu bạn muốn.


2
Đọc lại lần nữa. Quá trình đã chạy .
Cuộc đua nhẹ nhàng với Monica

/ xấu hổ không đọc kỹ. Lấy làm tiếc.
wangguoqin1001

Thực tế nohupcó thể được sử dụng cho việc này. Chỉ cần tạm dừng quá trình đang chạy và gửi nó đến nền ( Ctrl+ Zvà chạy bg) và sau đó bạn có thể phát hành nohup %1.
mike

0

Ngoài ra, nohupbạn có thể khởi chạy quy trình ở chế độ nền bằng cách sử dụng "&" và subshell:

Sử dụng lệnh với & và gói nó trong ngoặc đơn

$ (thecommand args &)

Hãy nói rằng quá trình của bạn đạt được năm 1922:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11473  2643  0 15:07 pts/1    00:00:00 bash
usr      11922     1  0 15:11 pts/1    00:00:00 thecommand

Hãy xem nó không bị ràng buộc từ quá trình shell 11473 vốn là cha mẹ ban đầu của nó. Vì vậy, nếu bạn thoát hoặc tắt shell hiện tại (11473), quy trình 11922 tiếp tục chạy và nó sẽ bị ngắt kết nối khỏi pts.

Cố gắng thoát khỏi vỏ và nhập vào một vỏ mới. Ngay cả khi, shell này được kết nối với cùng một pts, bạn có thể thấy quy trình ngay bây giờ mà không cần pts:

$ ps -fp 11922
UID        PID  PPID  C STIME TTY          TIME CMD
usr      11922     1  0 15:11 ?        00:00:00 thecommand

Tôi không biết làm thế nào nó được gọi hoặc ghi lại trong Posix, nhưng tôi sử dụng cách này từ năm 1990 trong bsh, ksh và bây giờ là bash.

Cuối cùng, bạn có thể sử dụng bglệnh shell dựng sẵn:

Chỉ cần khởi chạy chương trình của bạn và nếu bạn quyết định tạm dừng chương trình hoặc dự định giữ chương trình ở chế độ nền, hãy nhập CTRL + Z:

$ thecommand
^Z
[1] Stopped          thecommand

Bây giờ hãy để nó tiếp tục chạy trong nền:

$ bg
[1]+ thecommand &

Nếu bạn tìm đến infos process, nó vẫn chưa có process cha:

$ ps -f
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12046  2643  0 15:18 pts/6    00:00:00 bash
usr      12571 12046  0 16:00 pts/6    00:00:00 thecommand
usr      12601 12046  0 16:04 pts/6    00:00:00 ps -f

Vì vậy, thoát khỏi quá trình hiện tại. Quá trình chạy trong nền không được tách rời khỏi cha mẹ ban đầu của nó và tiếp tục chạy trong nền:

$ exit

Đăng nhập lại và xem thông tin quy trình:

$ ps -f 12571
UID        PID  PPID  C STIME TTY          TIME CMD
usr      12571     1  0 16:00 ?        00:00:00 thecommand
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.