2010-11-06 27 views
7

Tôi muốn bắt đầu một kịch bản điều khiển từ xa qua ssh như thế này:bắt đầu kịch bản từ xa thông qua ssh chứa nohup

ssh [email protected] -t 'cd my/dir && ./myscript data [email protected]' 

Các kịch bản làm những việc khác nhau mà làm việc tốt cho đến khi nói đến một dòng với nohup:

nohup time ./myprog $1 >my.log && mutt -a ${1%.*}/`basename $1` -a ${1%.*}/`basename ${1%.*}`.plt $2 < my.log 2>&1 & 

nó là nghĩa vụ phải bắt đầu chương trình myprog, ống đầu ra của nó để mylog và gửi một email với một số datafiles được tạo ra bởi myprog như tập tin đính kèm và đăng nhập như cơ thể. Mặc dù khi tập lệnh đạt đến dòng này, kết quả đầu ra ssh:

Kết nối với remote.org đã đóng.

Sự cố ở đây là gì?

Nhờ sự giúp đỡ

+1

Bạn nhận được e -thư? – thejh

+0

No. myprog không phải là bắt đầu cũng không gửi mutt. Để thử nghiệm i ssh'ed trên điều khiển từ xa để kiểm tra những gì đang xảy ra. Ngoài ra của tôi.log trống (nó được touch'ed trước bởi kịch bản). – litro

+0

Điều gì sẽ './Myprog' ghi vào stdout nếu đối số của nó không chính xác? 'Myerr.log' có chứa gì khi bạn viết' ./myprog $ 1> my.log 2> myerr.log'? – thejh

Trả lời

5

lệnh của bạn chạy một đường ống dẫn của các quá trình ở chế độ nền, vì vậy kịch bản gọi điện thoại sẽ thoát ngay lập tức (hoặc rất ngay sau đó). Điều này sẽ gây ra ssh để đóng kết nối. Điều đó sẽ làm cho SIGHUP được gửi đến bất kỳ quá trình nào được gắn với thiết bị đầu cuối mà tùy chọn -t gây ra.

Quy trình time ./myprog của bạn được bảo vệ bởi nohup, vì vậy nó sẽ tiếp tục chạy. Tuy nhiên, mutt của bạn không phải là và đó có thể là vấn đề ở đây. Tôi khuyên bạn nên thay đổi dòng lệnh của mình thành:

nohup sh -c "time ./myprog $1 >my.log && mutt -a ${1%.*}/`basename $1` -a ${1%.*}/`basename ${1%.*}`.plt $2 < my.log 2>&1 " & 

để toàn bộ đường ống được bảo vệ. (Nếu điều đó không khắc phục được nó thì có thể cần phải làm gì đó với các bộ mô tả tập tin - ví dụ mutt có thể có các vấn đề khác với thiết bị đầu cuối không ở xung quanh - hoặc trích dẫn có thể cần điều chỉnh tùy thuộc vào các tham số - nhưng hãy thử bây giờ ...)

5

This answer có thể hữu ích. Nói tóm lại, để đạt được hiệu quả mong muốn, bạn phải làm những điều sau đây:

  1. Redirect tất cả các I/O trên lệnh nohup'ed xa
  2. Nói lệnh SSH địa phương của bạn để thoát khỏi càng sớm càng hoàn thành công việc bắt đầu quá trình từ xa.

Trích dẫn the answer I already mentioned, lần lượt trích dẫn wikipedia:

Nohuping việc backgrounded là ví dụ hữu ích khi đăng nhập qua SSH, vì công việc backgrounded có thể gây ra vỏ để treo trên logout do một điều kiện chủng tộc [ 2]. Vấn đề này cũng có thể được khắc phục bằng cách chuyển hướng cả ba I/O suối:

nohup myprogram > foo.out 2> foo.err < /dev/null & 

CẬP NHẬT

Tôi vừa mới đã thành công với mô hình này:

ssh -f [email protected] 'sh -c "((nohup command-to-nohup 2>&1 >output.file </dev/null) &)"' 
+1

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