Uruchom polecenie nohup w SSH, a następnie rozłącz się

46

Chcę wykonać skrypt start.shna zdalnym serwerze, który uruchamia to:

nohup node server.js &

Naiwnie nazywam SSH w ten sposób:

ssh myserver <<EOF
./start.sh &
EOF

To uruchamia skrypt, ale pozostawia połączoną sesję. Chcę wykonać ten krok z innymi poleceniami w skrypcie, więc to nie jest dobre.

Jak mogę SSH do zdalnego komputera, uruchomić nohuppolecenie w tle, a następnie się rozłączyć? Podejrzewam, że mógłbym umieścić sam proces SSH w tle, ale to nie wydaje się właściwe.

Steve Bennett
źródło

Odpowiedzi:

40

Znalazłeś już właściwą drogę, tutaj dokument.

UWAGA : możesz umieścić ssh (klienta) w tle, umieszczając & na końcu, ale nie zobaczysz wyniku. Jeśli naprawdę chcesz to zrobić, przekieruj stdout / stderr do pliku na wypadek, gdybyś musiał sprawdzić odpowiedź ze zdalnego hosta.

Zasadniczo możesz to zrobić na dwa sposoby:

Uruchom bezpośrednio polecenie {, s}

ssh user@host "nohup command1 > /dev/null 2>&1 &; nohup command2; command3"

LUB

ssh user@host "$(nohup command1 > /dev/null 2>&1 &) && nohup command2 >> /path/to/log 2>&1 &"

UWAGA : &&wymaga, aby pierwsze polecenie zwróciło 0 przed wykonaniem drugiego

Użyj tutaj dokumentu

ssh user@host << EOF
nohup command1 > /dev/null 2>&1 &
nohup command2 >> /path/to/command2.log 2>&1 &
......
EOF

Powyższe 3 opcje powinny działać dla Ciebie.

Ponadto spójrz na odpowiedź tutaj: https://askubuntu.com/a/348921/70270

Terry Wang
źródło
Dzięki - więc trochę brakowało mi naprawdę > /dev/null.
Steve Bennett
Nie > /dev/null 2>&1do końca , to odrzucenie dowolnego wyjścia stdout / stderr poprzez przekierowanie do lol czarnej dziury
Terry Wang
5
Zauważ, że sugerowałbym użycie >> zamiast po prostu> do zapisu do plików dziennika. W przeciwnym razie błędy pojawią się tylko od ostatniego uruchomienia.
Alexis Wilke
Czy to prawda, że ​​jeśli po prostu uruchomię polecenie jak nohup command2 >> /path/to/command2.log 2>&1 &w terminalu, a następnie zamknę terminal, że proces zostanie utracony?
Łukasz
1
@TerryWang drugi przykład nie będzie działał z ampersand, a następnie z ampersand, patrz unix.stackexchange.com/q/67006/86716
tsionyx
7

Dlaczego nie po prostu tmux lub screen i skończyć z tym? Na przykład:

$ tmux new -s SessionNameHere
$ nohup /path/to/your/script.sh

Jest to praktyczne, jeśli jest to coś, co będzie się zapętlać lub zajmie trochę czasu, aby zakończyć. Możesz rozłączyć się z sesją, która pozostanie aktywna.

Zaraz
źródło
2
Naprawdę nie pasuje do tego, o co proszę, czyli jednego polecenia, które można uruchomić na moim laptopie, który połączy, rozwinie polecenie, a następnie rozłączy.
Steve Bennett
3
ssh node "nohup sleep 10 &"

nie działa w trybie demona, utrzymując sesję ssh połączoną. Sesja Ssh powróci za 10 sekund, mimo że użyłeś nohup.

Powodem jest to, że zdalne stdout i stderr nadal są podłączone do twojej sesji. Utrzymuje sesję ssh przy życiu, nohup nie pomaga.

To:

ssh node "nohup sleep 10 1>/dev/null 2>/dev/null &"

wraca natychmiast. Rozpoczyna zdalny proces od nohup i natychmiast kończy sesję ssh.

Siergiej Czerepanow
źródło
To był dokładnie nasz problem. Mieliśmy tylko 1> plik.log. SSH na jednej maszynie utknął. Proces na komputerze „węzłowym” był uruchomiony. Kiedy dodaliśmy 2> i 1 tuż przed zamknięciem &, które pozwalają ssh się rozłączyć.
Lee Meador
2

Krótsza forma:

ssh host "(command 1; command 2; ...) &>/dev/null &"

Wygląda na to, że samo bash wykonuje odłączanie od terminala, więc nie jest potrzebne żadne działanie. Używam Ubuntu 14.04 x86_64, bash 4.3.11.

Alek_A
źródło
1
To nie daje odpowiedzi na pytanie. Aby skrytykować lub poprosić autora o wyjaśnienie, zostaw komentarz pod jego postem - zawsze możesz komentować własne posty, a gdy będziesz mieć wystarczającą reputację , będziesz mógł komentować każdy post . - Z recenzji
David Foerster
To nie działa. nohup; po prostu wysyła skargę dotyczącą brakujących argumentów.
Steve Bennett,
@DavidFoerster, nie mam pojęcia dlaczego, jeśli command 1; command 2; ...reprezentuje skrypt OP chcesz uruchomić. OP może również użyć specjalnego przypadku tej odpowiedzi:ssh myserver ./start.sh &>/dev/null &
Alek_A