Łączę się z serwerem linux za pośrednictwem szpachli SSH. Próbowałem uruchomić go jako proces w tle, taki jak ten:
$ node server.js &
Jednak po 2,5 godziny terminal staje się nieaktywny i proces umiera. Czy w ogóle mogę utrzymać proces przy życiu nawet przy odłączonym terminalu?
Edytuj 1
Właściwie to próbowałem nohup
, ale jak tylko zamknę terminal Putty SSH lub odłączę internet, proces serwera natychmiast się kończy.
Czy jest coś, co muszę zrobić w Putty?
Edytuj 2 (lutego 2012 r.)
Jest node.js
moduł na zawsze . Będzie działał serwer node.js jako usługa demona.
node.js
linux
background-process
murvinlai
źródło
źródło
exit
. Kiedy tylko zamykam okno Putty, to się nie udaje.Odpowiedzi:
Proste rozwiązanie (jeśli nie chcesz wracać do procesu, po prostu chcesz, aby nadal działał):
Istnieje również
jobs
polecenie, aby wyświetlić indeksowaną listę procesów w tle. Możesz zabić proces działający w tle, uruchamiając gokill %1
lubkill %2
używając numeru będącego indeksem procesu.Potężne rozwiązanie (pozwala ponownie połączyć się z procesem, jeśli jest interaktywny):
Następnie możesz odłączyć, naciskając Ctrl + a + d, a następnie podłączyć ponownie, uruchamiając
screen -r
Weź również pod uwagę nowszą alternatywę dla screena, tmux.
źródło
sudo bash
.nohup node server.js > /dev/null 2>&1 &
nohup
oznacza: Nie przerywaj tego procesu, nawet jeśli stty jest odcięty.> /dev/null
oznacza: stdout przechodzi do / dev / null (które jest urządzeniem pozornym, które nie rejestruje żadnych danych wyjściowych).2>&1
oznacza: stderr również przechodzi do standardowego wyjścia (do którego już przekierowano/dev/null
). Możesz zastąpić & 1 ścieżką pliku, aby zachować dziennik błędów, np .:2>/tmp/myLog
&
na końcu oznacza: uruchom to polecenie jako zadanie w tle.źródło
/dev/null
? Ładne logowanie ... Powodzenia w próbach debugowania tego ...Naprawdę powinieneś spróbować użyć
screen
. Jest to nieco bardziej skomplikowane niż samo robienienohup long_running &
, ale zrozumienie ekranu, gdy już nigdy nie wrócisz.Najpierw rozpocznij sesję ekranową:
Uruchom cokolwiek chcesz:
Naciśnij ctrl + A, a następnie d. Gotowy. Sesja trwa w tle.
Możesz wyświetlić listę wszystkich sesji
screen -ls
i dołączyć do niektórych za pomocąscreen -r 20673.pts-0.srv
polecenia, gdzie 0673.pts-0.srv jest listą wpisów.źródło
To stare pytanie, ale ma wysoką pozycję w Google. Prawie nie mogę uwierzyć w najwyżej głosowane odpowiedzi, ponieważ uruchomienie procesu node.js w sesji ekranowej, z flagą
&
lub nawet znohup
flagą - wszystkie - są tylko obejściami.Zwłaszcza rozwiązanie screen / tmux, które naprawdę powinno być uważane za rozwiązanie amatorskie . Screen i Tmux nie są przeznaczone do utrzymywania procesów w działaniu, ale do multipleksowania sesji terminalowych. W porządku, gdy uruchamiasz skrypt na serwerze i chcesz się rozłączyć. Ale w przypadku serwera node.js nie chcesz, aby proces był dołączany do sesji terminala. To jest zbyt delikatne. Aby wszystko działało, musisz demonizować ten proces!
Istnieje wiele dobrych narzędzi do tego.
PM2 : http://pm2.keymetrics.io/
Jedną dużą zaletą, którą widzę na korzyść PM2, jest to, że może on wygenerować skrypt uruchamiania systemu, aby proces trwał między ponownymi uruchomieniami:
Gdzie
platform
może byćubuntu|centos|redhat|gentoo|systemd|darwin|amazon
.forever.js : https://github.com/foreverjs/forever
Skrypty inicjujące :
Nie wchodzę w szczegółowe informacje na temat pisania skryptu inicjującego, ponieważ nie jestem ekspertem w tym temacie i odpowiedź byłaby zbyt długa, ale w zasadzie są to proste skrypty powłoki uruchamiane przez zdarzenia systemu operacyjnego. Możesz przeczytać więcej na ten temat tutaj
Doker :
Po prostu uruchom swój serwer w kontenerze Docker z
-d
opcją i, voilá , masz demonizowany serwer node.js!Oto przykładowy plik Docker (z oficjalnego przewodnika node.js ):
Następnie zbuduj obraz i uruchom kontener:
Mam nadzieję, że to pomoże komuś lądować na tej stronie. Zawsze używaj odpowiedniego narzędzia do pracy. Zaoszczędzi Ci wiele bólów głowy i ponad godziny!
źródło
tail -f
umieszczając plik dziennika, który generuje pm2.screen
rozwiązanie, które znajduje wiele osób, a praca jest obejściem problemu. Istnieje wiele sposobów osiągnięcia określonego zadania. Wierzę, że zdarza się, że (rozważ konkretne pytanie) zdarza się, że osiąga się szczególne zadanierun as background and never die
doskonałości dla wielu. Ma również dodatkową zaletę polegającą na umożliwieniu użytkownikowi powrotu do niego w celu ponownej interakcji i wprowadzania zmian, jeśli chce. Kluczem jest to, że komponenty tobackground
inever die
. Wszystkie rozwiązania mają pewne bonusy.nohup
jest rozwiązanie. Jest wbudowany w Linuksa i właśnie po to. To jedna linia, jest czysta i działa zgodnie z przeznaczeniem, za każdym razem, niezależnie od aktualizacji. Ludzie powinni naprawdę unikać używania narzędzi innych firm do takich podstawowych zastosowań. Przykład dokera (na przykład) jest bardziej szczegółowy i wymaga dużo zasobów niż jedno proste polecenie w najczęściej głosowanej odpowiedzi. Uwielbiam Dockera, ale nie za to.nohup
rozwiązanie nie spełnia wymogu „nigdy nie umieraj”. O ile nie napiszesz bardzo trudnejtrap
lub zhackowanej nieskończonej pętli, nie widzę, jak utrzymać demonizację procesu bez użycia specjalnie napisanych do tego celu narzędzi (lub oczywiście skryptu inicjującego napisanego przez ciebie).inne rozwiązanie odrzuca pracę
źródło
nohup
pozwoli kontynuować program nawet po śmierci terminala. Rzeczywiście miałem sytuacje, w którychnohup
uniemożliwia prawidłowe zakończenie sesji SSH, więc powinieneś również przekierować dane wejściowe:W zależności od
nohup
konfiguracji może być konieczne przekierowanie standardowego wyjścia i standardowego błędu do plików.źródło
Mam tę funkcję w moim pliku rc powłoki, w oparciu o odpowiedź @ Yoichi:
Możesz użyć tego w ten sposób:
źródło
Nohup i screen oferują świetne, lekkie rozwiązania do uruchamiania Node.js w tle. Menedżer procesów Node.js ( PM2 ) to przydatne narzędzie do wdrażania. Zainstaluj go z npm globalnie w swoim systemie:
npm install pm2 -g
aby uruchomić aplikację Node.js jako demon:
pm2 start app.js
Opcjonalnie możesz połączyć go z Keymetrics.io SAAS monitorującym wykonanym przez Unitech.
źródło
Usunie polecenie z listy aktywnych zadań i wyśle polecenie w tło
źródło
Czy czytałeś o poleceniu nohup ?
źródło
Aby uruchomić komendę jako usługę systemową na debianie z sysv init:
Skopiuj szkielet skryptu i dostosuj go do swoich potrzeb, prawdopodobnie wszystko, co musisz zrobić, to ustawić niektóre zmienne. Twój skrypt odziedziczy dokładne ustawienia domyślne
/lib/init/init-d-script
, jeśli coś nie pasuje do twoich potrzeb - zastąp to w swoim skrypcie. Jeśli coś pójdzie nie tak, możesz zobaczyć szczegóły w źródle/lib/init/init-d-script
. Obowiązkowe sąDAEMON
iNAME
. Skrypt użyjestart-stop-daemon
do uruchomienia twojego polecenia, wSTART_ARGS
którym możesz zdefiniować dodatkowe parametrystart-stop-daemon
do użycia.W ten sposób uruchamiam niektóre rzeczy w języku Python na mojej wiki wiki:
Oprócz ustawiania zmiennych musiałem przesłonić,
do_stop_cmd
ponieważ Python zastępuje plik wykonywalny, więc usługa nie zatrzymała się poprawnie.źródło
Oprócz wyżej wymienionych fajnych rozwiązań wspomnę także o narzędziach nadzorczych i monitorujących, które pozwalają na rozpoczęcie procesu, monitorowanie jego obecności i uruchomienie w przypadku śmierci. Za pomocą „monit” możesz także uruchomić niektóre aktywne kontrole, takie jak sprawdzenie, czy proces odpowiada na żądanie http
źródło
W przypadku Ubuntu używam tego:
pozdrowienia
źródło
Wypróbuj to, aby uzyskać proste rozwiązanie
cmd i wyjdź
źródło