2009-10-27 11 views
20

Obecnie próbuję ssh do zdalnego komputera i uruchomić skrypt, a następnie opuścić węzeł z uruchomionym skryptem. Poniżej znajduje się mój skrypt. Jednak po uruchomieniu skrypt jest pomyślnie uruchamiany na komputerze, ale sesja ssh zawiesza się. Jaki jest problem?jak uruchomić polecenie w tle za pomocą ssh i odłączyć sesję

ssh -x [email protected]$node 'rm -rf statuslist 
         mkdir statuslist 
         chmod u+x ~/monitor/concat.sh 
         chmod u+x ~/monitor/script.sh 
         nohup ./monitor/concat.sh & 
         exit;' 

Odpowiedz

24

Istnieje kilka sytuacji, w których chcesz wykonać/uruchomić niektóre skrypty na zdalnej maszynie/serwerze (która zakończy się automatycznie) i rozłączyć się z serwerem.

np: Skrypt na pudełku, które po wykonanej

  1. trwa model i kopiuje je do zdalnego serwera
  2. tworzy scenariusz do prowadzenia symulacji z modelem i przesunąć go do serwera
  3. uruchamia skrypt na serwerze i rozłącza
  4. Obowiązkiem skryptu w ten sposób rozpoczętego jest uruchomienie symulacji na serwerze i po zakończeniu (zajmie to kilka dni) skopiowanie wyników z powrotem do klienta.

chciałbym użyć następującego polecenia:

ssh remoteserver 'nohup /path/to/script `</dev/null` >nohup.out 2>&1 &' 

@CKeven, można umieścić wszystkie te polecenia na jednym skrypcie, wsuń go do zdalnego serwera i zainicjować w następujący sposób:

echo '#!/bin/bash 
rm -rf statuslist 
mkdir statuslist 
chmod u+x ~/monitor/concat.sh 
chmod u+x ~/monitor/script.sh 
nohup ./monitor/concat.sh & 
' > script.sh 

chmod u+x script.sh 

rsync -azvp script.sh remotehost:/tmp 

ssh remotehost '/tmp/script.sh `</dev/null` >nohup.out 2>&1 &' 

Nadzieja to działa ;-)

Edit: można również użyć ssh user @ host „piargi n -m -d -S SessionName "/ ścieżka/do/pliku wykonywalnego"”

który tworzy odłączoną sesję screen i uruchamia polecenie docelowej w nim

+0

Co zrobić, jeśli uruchomiona komenda wymaga danych wejściowych z pliku (na przykład dużego importu bazy danych, np. Mysql cayblood

4

Może to być standardowy strumień wejściowy. Wypróbuj ssh -n ... lub ssh -f ....

+0

miłe. Dzięki.' ssh -f "user @ host DISPLAY = myhost: 0.0 qtcreator &" ' – kyb

21

Co sądzisz o tym, aby użyć screen? Możesz uruchomić screen przez ssh, aby uruchomić polecenie (concat.sh), a następnie możesz powrócić do sesji screen, jeśli chcesz go monitorować (może być przydatny, w zależności od tego, co robi concat).

Aby być bardziej konkretne, spróbuj tego:

ssh -t [email protected]$node screen -dm -S testing ./monitor/concat.sh 

Należy uznać, że zachęty powraca natychmiast, i że concat.sh jest uruchomiony na komputerze zdalnym. Wyjaśnię niektóre z opcji:

  • ssh -t tworzy TTY. ekran tego wymaga.
  • screen -dm powoduje, że zaczyna się w trybie "odłączonym". To jest jak "tło" dla twoich celów.
  • -S Testowanie daje twojej sesji ekranowej nazwę. Jest opcjonalny, ale zalecany.

Teraz, gdy już to zrobisz, możesz iść do zdalnej maszyny i uruchomić to:

screen -r testing 

ta dołączy do sesji screen, który zawiera program. Stamtąd możesz go kontrolować, zabijać, widzieć jego wydruki i tak dalej. Ctrl-A, a następnie d odłączy Cię od sesji screen. screen -ls wyświetli listę wszystkich uruchomionych sesji.

+0

czy mówisz mi wyraźnie, jak to zrobić? –

+2

@ John Zwinck, czy to na pewno zadziałało dla Ciebie? Nie działają dla mnie: ssh -t HOST "screen -dm -S sleep sleep 10". Po prostu mówi "Połączenie z HOST jest zamknięte", a kiedy loguję się na serwer, nie ma oddzielnych ekranów. – richardkmiller

+4

@richardkmiller: Kiedy spróbowałem tego teraz, uzyskałem ten sam (zły) wynik, który zrobiłeś. Zmieniłem opcję '-t' na ssh zamiast' -f', tak że zmienia ona tło polecenia (i nie rozdziela TTY), a następnie zadziałała. Podejrzewam, że coś zmieniło się w ciągu ostatnich 2 lat Linuksa, odkąd napisałem tę odpowiedź ... spróbuj 'ssh -f HOST" screen -dm -S sleep sleep 10 "' i może się okazać, że teraz działa. –

0

dla mnie, tylko to działało:

screen -dmS name sh my-script.sh 

To oczywiście zależy od ekranu i pozwala dołączyć później, jeśli kiedykolwiek chcesz stdin lub stdout. Ekran zakończy się, gdy zakończy się strona my-script.sh.

0

Poniżej jest znacznie częstsza decyzja, która wymaga pewnych wysiłków w celu znalezienia i to naprawdę działa dla mnie:

#!/usr/bin/bash 
theScreenSessionName="test" 
theTabNumber="1" 
theStuff="date; hostname; cd /usr/local; pwd; /usr/local/bin/top" 

echo "this is a test" 

ssh -f [email protected] "/usr/local/bin/screen -x $theScreenSessionName -p $theTabNumber -X stuff \" 
$theStuff 
\"" 

Wysyła $ theStuff listę poleceń do karty nr $ theTabNumber sesji ekran $ theScreenSessionName wstępnie utworzone na "serwerze" w imieniu "użytkownika".

Należy pamiętać o końcowe spacje po -X rzeczy \” , który jest wysyłany do pokonania usterki a«rzeczy»opcja jest. Na spacje i $ theStuff w następnym wierszu są dołączane przez«Enter»(^ M) klawiszy. NIE PRZEGAP „em!

w«to jest test»wiadomość jest echem w pierwszym terminalu i $ polecenia theStuff są naprawdę wykonywane wewnątrz wspomnianego ekranu/karcie.

Powiązane problemy