Chạy lệnh nohup qua SSH, sau đó ngắt kết nối


46

Tôi muốn thực thi một tập lệnh, start.shtrên một máy chủ từ xa chạy chương trình này:

nohup node server.js &

Ngây thơ, tôi gọi SSH như thế này:

ssh myserver <<EOF
./start.sh &
EOF

Điều này bắt đầu tập lệnh, nhưng để phiên kết nối. Tôi muốn làm theo bước này với các lệnh khác trong một kịch bản, vì vậy điều đó không tốt.

Làm cách nào tôi có thể SSH đến máy từ xa, khởi chạy nohuplệnh vào nền, sau đó ngắt kết nối? Tôi cho rằng tôi có thể đặt quá trình SSH vào nền, nhưng điều đó có vẻ không đúng.

Câu trả lời:


40

Bạn đã tìm đúng cách, ở đây tài liệu.

LƯU Ý : bạn có thể đặt ssh (máy khách) vào nền bằng cách đặt & ở cuối, nhưng bạn sẽ không thấy đầu ra. Nếu bạn thực sự muốn làm điều này, hãy chuyển hướng thiết bị xuất chuẩn / stderr sang một tệp trong trường hợp bạn cần kiểm tra phản hồi từ máy chủ từ xa.

Về cơ bản, bạn có thể làm điều đó theo một trong hai cách:

Chạy trực tiếp lệnh {, s}

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

HOẶC LÀ

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

LƯU Ý : &&yêu cầu lệnh đầu tiên trả về 0 trước khi thực hiện lệnh thứ hai

Sử dụng tài liệu ở đây

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

3 tùy chọn trên sẽ làm việc cho bạn.

Ngoài ra, hãy xem câu trả lời tại đây: https://askubfox.com/a/336121/70270


Cảm ơn - vì vậy bit tôi đã mất thực sự là > /dev/null.
Steve Bennett

Không thực sự, > /dev/null 2>&1là loại bỏ bất kỳ đầu ra stdout / stderr nào bằng cách chuyển hướng đến lỗ đen lol
Terry Wang

5
Lưu ý rằng tôi sẽ đề xuất sử dụng >> thay vì chỉ> để ghi vào tệp nhật ký. Nếu không, bạn sẽ chỉ nhận được các lỗi từ lần chạy cuối cùng.
Alexis Wilke

Có đúng không nếu tôi chỉ bắt đầu một lệnh như nohup command2 >> /path/to/command2.log 2>&1 &trong một thiết bị đầu cuối và sau đó đóng thiết bị đầu cuối mà quá trình bị mất?
Lu-ca

1
@TerryWang ví dụ thứ hai sẽ không hoạt động với ampersand và theo sau là ampersand kép, xem unix.stackexchange.com/q/67006/86716
tsionyx 9/12/2016

7

Tại sao không chỉ là tmux hoặc màn hình và được thực hiện với nó? Ví dụ:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

Điều này là thực tế nếu đó là thứ sẽ liên tục lặp lại hoặc mất một lúc để hoàn thành. Bạn có thể ngắt kết nối khỏi phiên và nó sẽ vẫn hoạt động.


2
Không thực sự phù hợp với những gì tôi yêu cầu, đó là một lệnh duy nhất có thể chạy trên máy tính xách tay của tôi, nó sẽ kết nối, rẽ nhánh một lệnh, sau đó ngắt kết nối.
Steve Bennett

3
ssh node "nohup sleep 10 &"

không chạy trong chế độ daemon, giữ cho phiên ssh của bạn được kết nối. Phiên Ssh sẽ trở lại sau 10 giây, mặc dù bạn đã sử dụng nohup.

Lý do là thiết bị xuất chuẩn và thiết bị xuất chuẩn vẫn kết nối với phiên của bạn. Nó giữ phiên ssh sống, nohup không giúp đỡ.

Điều này:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

trả lại ngay lập tức Nó bắt đầu quá trình từ xa với nohup và thoát phiên ssh ngay lập tức.


Đây chính xác là vấn đề của chúng tôi. Chúng tôi chỉ có 1> file.log. Ssh trên một máy đã bị kẹt. Quá trình trên máy 'nút' đang chạy. Khi chúng tôi đã thêm 2> & 1 ngay trước khi đóng &, hãy để ssh ngắt kết nối.
Lee Meador

2

Mẫu ngắn hơn:

ssh host "(command 1; command 2; ...) &>/dev/null &"

Có vẻ như, bash tự thực hiện tách rời khỏi thiết bị đầu cuối, do đó không cần nohup. Tôi chạy Ubuntu 14.04 x86_64, bash 4.3.11.


1
Điều này không cung cấp một câu trả lời cho câu hỏi. Để phê bình hoặc yêu cầu làm rõ từ một tác giả, hãy để lại nhận xét bên dưới bài đăng của họ - bạn luôn có thể nhận xét về bài đăng của riêng bạn và khi bạn có đủ danh tiếng, bạn sẽ có thể nhận xét về bất kỳ bài đăng nào . - Từ đánh giá
David Foerster

Điều này dường như không hoạt động. nohup; chỉ đưa ra một khiếu nại về các đối số bị thiếu.
Steve Bennett

@DavidFoerster, không biết tại sao, nếu command 1; command 2; ...đại diện cho tập lệnh OP muốn chạy. OP cũng có thể sử dụng trường hợp đặc biệt của câu trả lời này:ssh myserver ./start.sh &>/dev/null &
Alek_A
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.