2009-10-27 32 views
20

Tôi hiện đang cố gắng ssh vào máy từ xa và chạy tập lệnh, sau đó thoát nút bằng tập lệnh đang chạy. Dưới đây là kịch bản của tôi. Tuy nhiên, khi nó chạy, kịch bản được chạy thành công trên máy nhưng phiên ssh bị treo. Có chuyện gì vậy?cách chạy lệnh trong nền bằng ssh và tách phiên

ssh -x [email protected]$node 'rm -rf statuslist 
         mkdir statuslist 
         chmod u+x ~/monitor/concat.sh 
         chmod u+x ~/monitor/script.sh 
         nohup ./monitor/concat.sh & 
         exit;' 

Trả lời

24

Có một số trường hợp khi bạn muốn thực thi/bắt đầu một số tập lệnh trên máy/máy chủ từ xa (sẽ tự động chấm dứt) và ngắt kết nối khỏi máy chủ.

ví dụ: Một kịch bản chạy trên một hộp mà khi thực hiện

  1. mất một mô hình và sao chép nó vào một máy chủ từ xa
  2. tạo ra một kịch bản cho chạy một mô phỏng với mô hình và đẩy nó đến máy chủ
  3. bắt đầu tập lệnh trên máy chủ và ngắt kết nối
  4. Nhiệm vụ của tập lệnh bắt đầu là chạy mô phỏng trong máy chủ và sau khi hoàn thành (sẽ mất vài ngày để hoàn tất) sao chép kết quả lại cho khách hàng.

tôi sẽ sử dụng lệnh sau:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &' 

@CKeven, bạn có thể đặt tất cả những lệnh trên một kịch bản, đẩy nó vào máy chủ từ xa và khởi động nó như sau:

echo '#!/bin/bash 
rm -rf statuslist 
mkdir statuslist 
chmod u+x ~/monitor/concat.sh 
chmod u+x ~/monitor/script.sh 
nohup ./monitor/concat.sh & 
' > script.sh 

chmod u+x script.sh 

rsync -azvp script.sh remotehost:/tmp 

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &' 

Hy vọng công trình này ;-)

Chỉnh sửa: Bạn cũng có thể sử dụng ssh user @ host 'scree n -S SessionName -d -m "/ path/to/thực thi"'

nào tạo ra một phiên màn hình tách ra và chạy lệnh mục tiêu bên trong nó

+0

Điều gì sẽ xảy ra nếu lệnh bạn đang chạy yêu cầu đầu vào từ một tệp (chẳng hạn như nhập db lớn, ví dụ: mysql cayblood

4

Đây có thể là luồng đầu vào chuẩn. Hãy thử ssh -n ... hoặc ssh -f ....

+0

Nice. Cảm ơn..' ssh -f "người dùng @ host DISPLAY = myhost: 0.0 qtcreator &" ' – kyb

21

Bạn nghĩ sao về việc sử dụng screen cho việc này? Bạn có thể chạy screen qua ssh để bắt đầu lệnh (concat.sh) và sau đó bạn có thể quay lại phiên màn hình nếu bạn muốn theo dõi nó (có thể hữu ích, tùy thuộc vào những gì concat nào).

Để cụ thể hơn, hãy thử này:

ssh -t [email protected]$node screen -dm -S testing ./monitor/concat.sh 

Bạn sẽ thấy rằng lợi nhuận nhanh chóng ngay lập tức, và rằng concat.sh đang chạy trên máy từ xa. Tôi sẽ giải thích một số tùy chọn:

  • ssh -t tạo TTY. màn hình cần điều này.
  • screen -dm làm cho thiết bị bắt đầu ở chế độ "tách rời". Điều này giống như "nền" cho mục đích của bạn.
  • -S kiểm tra cung cấp tên phiên của màn hình của bạn. Nó là tùy chọn nhưng được khuyến nghị.

Bây giờ, một khi bạn đã làm điều này, bạn có thể vào máy từ xa và chạy này:

screen -r testing 

này sẽ đính kèm bạn với phiên màn hình, trong đó có chương trình của bạn. Từ đó bạn có thể điều khiển nó, tiêu diệt nó, xem kết quả của nó, v.v. Ctrl-A, sau đó d sẽ tách bạn khỏi phiên màn hình. screen -ls sẽ liệt kê tất cả các phiên chạy.

+0

bạn có thể nói cho tôi biết cách làm điều này không? –

+2

@John Zwinck, điều này chắc chắn có hiệu quả với bạn không? oes không làm việc cho tôi: ssh -t HOST "màn hình -dm -S ngủ ngủ 10". Nó chỉ đơn giản là nói "Kết nối với HOST đóng" và khi tôi đăng nhập vào máy chủ không có màn hình tách rời. – richardkmiller

+4

@ richardkmiller: Khi tôi thử nó ngay bây giờ tôi đã nhận được cùng một kết quả (xấu) bạn đã làm. Tôi đã thay đổi tùy chọn '-t' thành ssh thành' -f' thay vào đó, để nó tạo ra lệnh (và không cấp phát một TTY), và sau đó nó hoạt động. Tôi nghi ngờ một cái gì đó thay đổi trong can thiệp 2 năm của Linux kể từ khi tôi đã viết câu trả lời này ... thử 'ssh -f HOST" màn hình -dm -S ngủ ngủ 10 "' và bạn có thể tìm thấy nó hoạt động ngay bây giờ. –

0

Đối với tôi, chỉ có này làm việc:

screen -dmS name sh my-script.sh 

Điều này, tất nhiên, phụ thuộc vào màn hình, và cho phép bạn đính kèm sau, nếu bạn đã bao giờ muốn stdin hoặc stdout. Màn hình sẽ tự kết thúc khi my-script.sh kết thúc.

0

Dưới đây là một quyết định phổ biến hơn nhiều đòi hỏi một số nỗ lực để tìm kiếm, và nó thực sự làm việc cho tôi:

#!/usr/bin/bash 
theScreenSessionName="test" 
theTabNumber="1" 
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top" 

echo "this is a test" 

ssh -f [email protected] "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff 
\"" 

Nó sẽ gửi $ theStuff danh sách các lệnh để tab Không $ theTabNumber phiên màn hình $ theScreenSessionName được tạo sơ bộ tại 'server' thay mặt cho 'user'.

Hãy lưu ý một khoảng trống ở cuối sau -X công cụ \ " được gửi để khắc phục sự cố của tùy chọn 'công cụ'. Khoảng trắng và $ theStuff trong dòng tiếp theo được nối thêm bằng 'Enter' (^ M) tổ hợp phím. KHÔNG HOA HẬU 'EM!

các 'đây là một thử nghiệm' thông điệp được lặp lại trong thiết bị đầu cuối ban đầu, và $ theStuff lệnh đang thực sự thực hiện bên trong màn hình đề cập/tab

Các vấn đề liên quan