Thực hiện một lệnh chạy dài trên ssh


10

Tôi đang sshvào một máy chủ và tôi đang bắt đầu một tập lệnh Python sẽ mất khoảng. 24 giờ để hoàn thành. Nếu kết nối internet của tôi chết ở giữa thì sao? Điều đó sẽ dừng lệnh?

Có cách nào để chạy lệnh chạy dài của tôi theo cách ngắt kết nối cục bộ sẽ không ảnh hưởng đến nó và tôi có thể tiếp tục thấy đầu ra của nó sau khi tôi đăng nhập sshlại không?

Câu trả lời:


29

Cách tốt nhất là sử dụng screen(trên máy chủ) để bắt đầu một phiên để chạy lệnh và sau đó ngắt kết nối màn hình để nó tiếp tục chạy và bạn có thể làm những việc khác hoặc chỉ ngắt kết nối với máy chủ. Tùy chọn khác là sử dụng nohupkết hợp với &để bạn sẽ cónohup <command> &


Màn. Hoặc bạn có thể thiết lập một tác vụ cron nếu đó là thứ bạn chạy nhiều hơn một lần.
xeon

2
Nếu bạn bị ngắt kết nối trong khi nó đang chạy trên màn hình, screen -rsẽ kết nối lại với bạn.
dpflug

2

Bạn cũng có thể sử dụng disownnếu bạn đã bắt đầu quá trình mà không screenhoặcnohup


2

Các câu trả lời hiện có có thể hoạt động tốt, nhưng tôi cần một cái gì đó cho BusyBox (một trình bao và bộ công cụ cho phần cứng tối thiểu như bộ định tuyến gia đình). Hệ thống của tôi không có screen, dtach, at, disown, hoặc thậm chí nohup! Vì vậy, nhờ tbc0 trên SO ( link ), tôi đã tìm thấy viên ngọc này. Nó trả về ngay lập tức nhưng quá trình máy chủ tiếp tục chạy:

ssh myserver 'sleep 100 >&- 2>&- <&- &'

Hoặc, nếu cần nhiều lệnh:

ssh myserver '(echo one; sleep 100; echo two; sleep 200) >&- 2>&- <&- &'

Giải trình:

  • >&- - đóng stdout xử lý
  • 2>&- - đóng stderr
  • <&- - đóng stdin
  • & - đặt quá trình trong nền

Điều này sử dụng không có chương trình bên ngoài và nên hoạt động trên ksh, tro, vỏ Bourne, bash, v.v.


1

Nếu bạn đặt nền cho một quy trình và đóng phiên của mình, quy trình sẽ được thông qua bởi init (PID 1).

Nếu tôi có một phiên và làm:

]$ sleep 10000 &
]$ exit

và mở một phiên khác và chạy:

]$ ps -ef | grep sleep
501      26387     1  0 16:37 ?        00:00:00 sleep 10000
root     26422 21360  0 16:40 pts/0    00:00:00 grep sleep

Quá trình của tôi vẫn đang chạy và chúng tôi thấy rằng quy trình mẹ của nó hiện là 1 (init).

Ngoài ra, bạn có thể thiết lập tập lệnh của mình giống như một daemon. Một tìm kiếm nhanh xuất hiện liên kết có vẻ hữu ích này: http://onlamp.com/python/pythoncook2/solution.csp?day=1 . Nếu bạn muốn thực hiện phương pháp đó.

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.