Napisałem skrypt, którego używam do wypychania i wdrażania nowej usługi na kilku maszynach pod moją kontrolą, a do wykonania procesu używam ssh do zdalnego uruchomienia procesu. Niestety, ilekroć używam SSH do uruchomienia procesu, polecenie SSH nigdy nie zwraca wartości, powodując zatrzymanie skryptu.
Polecenie jest określone jako: ssh $ użytkownik @ $ host "/ root / command &". Ilekroć uruchamiam proste polecenia, takie jak ps lub who, polecenie SSH natychmiast wraca, jednak gdy próbuję rozpocząć proces, nie zwraca. Próbowałem sztuczek, takich jak zawijanie mojego procesu w prosty skrypt bash, który uruchamia proces, a następnie kończy działanie, jednak powoduje to także zawieszenie polecenia SSH (nawet jeśli skrypt bash wyświetla komunikat o powodzeniu i kończy działanie normalnie).
Czy ktoś ma wgląd w to, co powoduje takie zachowanie i jak mogę uzyskać polecenie SSH, aby powróciło, gdy tylko proces się rozpocznie?
Dzięki za wgląd!
Odpowiedzi:
SSH łączy stdin, stdout i stderr zdalnej powłoki z lokalnym terminalem, dzięki czemu można wchodzić w interakcje z poleceniem działającym po stronie zdalnej.
Jako efekt uboczny będzie działał do momentu zamknięcia tych połączeń, co dzieje się tylko wtedy, gdy zdalne polecenie i wszystkie jego elementy potomne (!) Zostaną zakończone (ponieważ elementy potomne, czyli to, co zaczyna się od „&”, dziedziczą std * po ich proces nadrzędny i pozostaw go otwartym).
Musisz więc użyć czegoś takiego
<,> I 2> i 1 przekierowują stdin / stdout / stderr z twojego terminala. „&” Powoduje następnie przejście skryptu w tło. Podczas produkcji przekierowałbyś oczywiście stdin / err do odpowiedniego pliku dziennika.
Widzieć
http://osdir.com/ml/network.openssh.general/2006-05/msg00017.html
Edytować:
Właśnie dowiedziałem się, że
< /dev/null
powyższe nie jest konieczne (ale przekierowanie stdout / err jest ). Nie mam pojęcia, dlaczego ...źródło
+1
! Pracuje dla mnie. Możesz także wydrukować dane wyjściowe za pomocą echa pliku dziennika:ssh user@host "/script/to/run > /tmp/ssh.stdout 2>&1 && cat /tmp/ssh.stdout && rm -f /tmp/ssh.stdout"
Możesz spróbować nohup . Człowieku nohup po więcej szczegółów.
Jeśli chcesz zachować dane wyjściowe na zdalnym komputerze, oto wariant .
źródło
Inną alternatywą byłoby odpalenie wolnostojącego
screen(1)
, coś takiego:Spowoduje to uruchomienie odłączonego ekranu (który przechwytuje wszystkie zawarte w nim interakcje), a następnie natychmiast powróci, kończąc sesję ssh.
Przy odrobinie pomysłowości możesz w ten sposób rozwiązywać dość złożone zdalne polecenia.
źródło
źródło
Myślę, że byłby to właściwy sposób
źródło