2012-09-28 39 views
8

Tôi muốn bắt đầu quá trình sử dụng nohup trên máy từ xa thông qua ssh. Vấn đề là làm thế nào để có được PID của quá trình bắt đầu với nohup, do đó, "quá trình thực sự làm một cái gì đó", không phải một số trường hợp vỏ bên ngoài hoặc tương tự. Ngoài ra, tôi muốn lưu trữ stdout và stderr trong các tập tin, nhưng đó không phải là vấn đề ở đây ...Lấy PID của quá trình bắt đầu bằng nohup qua ssh

tại địa phương, nó hoạt động một cách hoàn hảo bằng

nohup sleep 30 > out 2> err < /dev/null & echo $! 

Nó được lặp lại cho tôi chính xác PID của lệnh " ngủ 30 ", mà tôi cũng có thể thấy bằng cách sử dụng" top "hoặc" ps aux | grep sleep ".

Nhưng tôi đang gặp sự cố khi thực hiện điều khiển từ xa qua ssh. Tôi đã thử một cái gì đó như

ssh remote_machine 'nohup bash -c "((sleep 30) &)" > out 2> err < /dev/null' 

nhưng tôi không thể tìm ra nơi để đặt "echo $!" để nó được hiển thị trong shell cục bộ của tôi. Nó luôn hiển thị cho tôi các PID sai, ví dụ như một trong các ví dụ "bash", vv ..

Có ai đó là một ý tưởng để giải quyết vấn đề này không?

EDIT: OK, "bash -c" có thể không cần thiết ở đây. Giống như Lotharyx chỉ ra, tôi nhận được quyền PID tốt sử dụng

ssh remote 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 

nhưng sau đó vấn đề là nếu bạn thay thế "giấc ngủ 30" với một cái gì đó tạo ra, nói, "echo Hello World!", Đầu ra không kết thúc trong tập tin "ra", không phải trên địa phương cũng không ở phía bên. Bất cứ ai có một ý tưởng tại sao?

EDIT2: Lỗi của tôi! Chỉ có không có không gian còn lại trên các thiết bị khác, đó là lý do tại sao các tập tin "ra" và "err" vẫn trống!

Vì vậy, tính năng này đang hoạt động. Ngoài ra, nếu ai muốn gọi nhiều lệnh liên tiếp, cách nhau bằng một dấu chấm phẩy (;), người ta có thể vẫn sử dụng "bash -c", như vậy:

ssh remote 'nohup bash -c "echo bla;sleep 30;echo blupp" > out 2> err < /dev/null & echo $!' 

Sau đó, nó in ra PID của "bash -c" ở phía địa phương, điều đó rất tốt. (Không thể lấy PID của quy trình "trong cùng" hoặc "bận", bởi vì mọi chương trình có thể sinh ra các quy trình con mới, không có cách nào để tìm ra ...)

Trả lời

8

Tôi đã thử những điều sau (địa phương máy là Debian; máy từ xa là CentOS), và nó đã làm việc đúng như tôi nghĩ rằng bạn đang mong đợi:

 
    ~# ssh [email protected] 'nohup sleep 30 > out 2> err < /dev/null & echo $!' 
    [email protected]'s password: 
    14193 
    ~# 

Trên máy từ xa, tôi đã ps -e, và nhìn thấy dòng này:

 
    14193 ?  00:00:00 sleep 

Vì vậy, rõ ràng, trên máy cục bộ của tôi, đầu ra là PID của "sleep" thực thi trên máy từ xa.

Tại sao bạn thêm bash vào lệnh của mình khi gửi nó qua đường hầm SSH?

+0

Hmm, bạn nói đúng, nhưng dường như vẫn có vấn đề với thiết bị xuất chuẩn. Ví dụ, nếu tôi thay thế "sleep 30" với cái gì đó là sản xuất đầu ra, như "echo Hello World!", Nó không kết thúc trong tập tin "out", nhưng được trả lại cho tôi giống như PID. –

+0

Tôi nghĩ rằng tôi đã thêm "bash -c" bởi vì tôi muốn thực thi nhiều lệnh trong một hàng, như "echo foo; ngủ 30; echo bar". –

+0

Lỗi của tôi, giải pháp của bạn là hoàn toàn làm việc! –

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