Uzyskaj PID procesu rozpoczętego przez nohup przez ssh

Chcę rozpocząć proces za pomocą nohup na zdalnej maszynie przez ssh. Problem polega na tym, jak uzyskać PID procesu rozpoczętego od nohup, więc „proces faktycznie coś robi”, a nie jakaś zewnętrzna instancja powłoki lub tym podobne. Ponadto chcę przechowywać stdout i stderr w plikach, ale to nie jest problem tutaj ...

Lokalnie działa bez zarzutu

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

Powtarza mi dokładny PID polecenia „sleep 30”, który widzę także za pomocą „top” lub „ps aux | grep sleep”.

Ale mam problem z wykonaniem tego zdalnie przez ssh. Próbowałem czegoś takiego

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

ale nie wiem, gdzie umieścić „echo $!” tak, że jest wyświetlany w mojej lokalnej powłoce. Zawsze pokazuje mi błędne PID, na przykład ten z instancji „bash” itp.

Czy ktoś ma pomysł, jak to rozwiązać?

EDYCJA: OK, „bash -c” może nie być tutaj potrzebny. Jak zauważył Lotharyx, otrzymuję odpowiedni PID

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

ale problem polega na tym, że jeśli zastąpisz „sleep 30” czymś, co generuje dane wyjściowe, powiedz „echo Hello World!”, to wyjście nie trafi do pliku „out”, ani po stronie lokalnej, ani po stronie zdalnej. Ktoś ma pomysł dlaczego?

EDIT2: Moja wina! Nie było już wolnego miejsca na innym urządzeniu, dlatego pliki „out” i „err” pozostały puste!

Więc to działa. Ponadto, jeśli ktoś chce wywołać wiele poleceń z rzędu, oddzielonych średnikiem (;), nadal można użyć „bash -c”, tak jak poniżej:

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

Następnie wypisuje PID „bash -c” po stronie lokalnej, co jest w porządku. (Niemożliwe jest uzyskanie PID procesu „najgłębszego” lub „zajętego”, ponieważ każdy program może odradzać nowe podprocesy, nie ma sposobu, aby się dowiedzieć ...)

questionAnswers(1)

yourAnswerToTheQuestion