Câu trả lời:
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 ssh
phiên và vỏ cách chạy lệnh, giống như screen
, tmux
, byobu
, nohup
và 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 stdout
và stderr
không thể ghi / đóng, bạn có thể đặt nó ở chế độ nền trước khi đăng xuất ControlZvà bg
sau đó tách nó ra khỏi vỏ của bạn với phần disown
dự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ã và 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.
disown
lệnh
bg
lệ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.
kill -CONT
gần giống như bg.
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 -r
và 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 screen
trướ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.
tmux
là một chương trình khác giống như screen
vậ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.
screen
.
screen
hoặc tmux
.)
Một trong những cách "tiêu chuẩn" để làm như vậy, là sử dụng nohup
lệ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
& STDERR
AFAIK) 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.
nohup
có 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
+ Z
và chạy bg
) và sau đó bạn có thể phát hành nohup %1
.
Ngoài ra, nohup
bạ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 bg
lệ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
disown
lệ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 -all
nhưng dường như không hoạt động (mức sử dụng CPU là 0%)