Sử dụng SSH để bắt đầu một quá trình từ xa


18

Tôi đã viết một tập lệnh mà tôi đang sử dụng để đẩy và triển khai một dịch vụ mới tới một số máy dưới sự kiểm soát của tôi và để thực hiện quy trình tôi đang sử dụng ssh để bắt đầu quá trình từ xa. Thật không may, bất cứ khi nào tôi sử dụng SSH để bắt đầu quá trình, lệnh SSH dường như không bao giờ quay trở lại, khiến tập lệnh bị đình trệ.

Lệnh được chỉ định là: ssh $ user @ $ host "/ root / lệnh &". Bất cứ khi nào tôi chạy các lệnh đơn giản, chẳng hạn như ps hoặc ai, lệnh SSH sẽ trả về ngay lập tức, tuy nhiên khi tôi thử và bắt đầu quá trình của mình thì nó không trả về. Tôi đã thử các thủ thuật như gói quá trình của mình trong một tập lệnh bash đơn giản để bắt đầu quá trình và sau đó thoát, tuy nhiên điều này cũng treo lệnh SSH (ngay cả khi tập lệnh bash lặp lại thông báo thành công và thoát bình thường).

Có ai có cái nhìn sâu sắc về những gì gây ra hành vi này không và làm cách nào tôi có thể khiến lệnh SSH quay trở lại ngay khi quá trình được bắt đầu?

Cảm ơn những hiểu biết của bạn!


Đăng dòng lệnh chính xác mà bạn đang sử dụng ... bỏ qua mật khẩu / tên người dùng / IP
Joseph Kern

ssh $ SSH_USER @ $ HOST_ADDR "/ root / AppName &"
rmrobins

Tôi nên đề cập rằng tôi đã thiết lập các khóa SSH, vì vậy không cần thiết phải sử dụng mật khẩu để chạy các lệnh trên các hệ thống từ xa.
rmrobin

@rmrobins, một bước rất tốt - thiết lập auth khóa công khai.
nik

Câu trả lời:


28

SSH kết nối stdin, stdout và stderr của shell từ xa với thiết bị đầu cuối cục bộ của bạn, để bạn có thể tương tác với lệnh đang chạy ở phía xa.

Như một tác dụng phụ, nó sẽ tiếp tục chạy cho đến khi các kết nối này bị đóng, điều này chỉ xảy ra khi lệnh từ xa và tất cả các con của nó (!) Đã chấm dứt (vì các con, đó là những gì "&" bắt đầu, thừa hưởng std * từ chúng quá trình cha mẹ và giữ cho nó mở).

Vì vậy, bạn cần phải sử dụng một cái gì đó như

ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"

<,> Và 2> & 1 chuyển hướng stdin / stdout / stderr ra khỏi thiết bị đầu cuối của bạn. "&" Sau đó làm cho tập lệnh của bạn đi đến nền. Trong sản xuất, tất nhiên bạn sẽ chuyển hướng stdin / err sang một logfile phù hợp.

Xem

http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html

Chỉnh sửa:

Chỉ cần phát hiện ra rằng những điều < /dev/nulltrên là không cần thiết (nhưng chuyển hướng stdout / err ). Không biết tại sao ...


Cảm ơn, đây chính xác là những gì tôi đang tìm kiếm - điều đó không xảy ra với tôi rằng quá trình này sẽ kế thừa std * ngay cả khi sử dụng & để khởi chạy nó trong nền.
rmrobin

+1! Làm việc cho tôi. Và bạn cũng có thể in kết quả đầu ra bằng cách lặp lại tệp nhật ký: ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Được đăng

5

Bạn có thể thử nohup . Man nohup để biết thêm chi tiết.

ssh host "nohup script &"

Nếu bạn muốn giữ đầu ra trên máy từ xa, đây là một biến thể .

ssh user@host 'export REMOTE=myname; nice nohup ./my-restart >
logfile.log 2>&1 &'

5

Một cách khác là bắn lên một chiếc tách ra screen(1), đại loại như:

ssh -l user host "screen -d -m mycommand"

Điều này sẽ bắt đầu một màn hình tách rời (nắm bắt tất cả các tương tác bên trong nó) và sau đó ngay lập tức quay lại, chấm dứt phiên ssh.

Với một chút khéo léo hơn, bạn có thể giải quyết các lệnh gọi từ xa khá phức tạp theo cách này.


4
 -f      Requests ssh to go to background just before command execution.
         This is useful if ssh is going to ask for passwords or
         passphrases, but the user wants it in the background.  This
         implies -n.  The recommended way to start X11 programs at a
         remote site is with something like ssh -f host xterm.

         If the ExitOnForwardFailure configuration option is set to “yes”,
         then a client started with -f will wait for all remote port for‐
         wards to be successfully established before placing itself in the
         background.

1
Vấn đề với phương pháp này là lệnh SSH không thực sự bị chấm dứt, nó chỉ bị ẩn trong nền, do đó, máy chủ đang chạy tập lệnh sẽ có một số lượng lớn các lệnh SSH trong nền không bao giờ quay lại vì các lệnh SSH không bao giờ quay trở lại ( tức là vấn đề gốc tôi muốn giải quyết)
rmrobins

-1

Tôi nghĩ rằng cách chính xác sẽ là

ssh user@host exec script.sh &

Không, điều đó không làm việc cho tôi. Tại sao nên làm thế?
sleske

Tôi đã không sử dụng nền tảng đẩy qua ssh, đã cố gắng mà không có một điều khoản trong tay. lỗi của tôi.
nik
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.