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.

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


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.


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.


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.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.