Pracuję na komputerze z systemem Linux za pośrednictwem SSH (Putty). Muszę zostawić proces działający w nocy, więc pomyślałem, że mogę to zrobić, uruchamiając proces w tle (ze znakiem ampersand na końcu polecenia) i przekierowując standardowe wyjście do pliku.
Ku mojemu zdziwieniu to nie działa. Gdy tylko zamknę okno Kit, proces zostanie zatrzymany.
Jak mogę temu zapobiec?
linux
process
ssh
background-process
Uwolnić się
źródło
źródło
nohup command > /dev/null 2>&1 &
do uruchomienia w tle bez tworzenia wyjścia stdout lub stderr (beznohup.out
pliku)nohup
nie pomaga w tym przypadku. Czy jest jakiś sposób na zabawę zCtrl+Z
/bg
?Polecam korzystanie z ekranu GNU . Umożliwia rozłączenie się z serwerem, podczas gdy wszystkie procesy nadal działają. Nie wiem, jak żyłem bez niego, zanim wiedziałem, że istnieje.
źródło
Po zamknięciu sesji proces odbiera sygnał SIGHUP, który najwyraźniej nie łapie. Możesz użyć
nohup
polecenia podczas uruchamiania procesu lub wbudowanego polecenia bashdisown -h
po uruchomieniu procesu, aby temu zapobiec:źródło
demonizować? nie? EKRAN? (tmux ftw, ekran jest śmieci ;-)
Po prostu rób to, co robiła każda inna aplikacja od samego początku - podwójny widelec.
Huk! Zrobione :-) Użyłem tego niezliczoną ilość razy na wszystkich typach aplikacji i wielu starych maszynach. Możesz łączyć się z przekierowaniami i czymkolwiek, aby otworzyć prywatny kanał między tobą a procesem.
Utwórz jako coproc.sh:
i wtedy
I proszę bardzo, spawnuj cokolwiek. <(:) otwiera anonimową potok poprzez podstawienie procesu, który umiera, ale potok się zatrzymuje, ponieważ masz do niego uchwyt. Zwykle robię
sleep 1
zamiast,:
ponieważ jest to nieco ryzykowne, i pojawia się błąd „zajęty plik” - nigdy się nie zdarza, jeśli uruchomione zostanie prawdziwe polecenie (np.command true
)„heredoc sourcing”:
Działa to na każdej powłoce, jaką kiedykolwiek próbowałem, w tym busybox / etc (initramfs). Nigdy wcześniej tego nie widziałem, samodzielnie to odkryłem podczas szturchania, kto wiedział, że źródło może zaakceptować argumenty? Ale często jest to znacznie łatwiejsza do opanowania forma ewaluacji, jeśli istnieje coś takiego.
źródło
ssh myhost "((exec sleep 500)&) >/dev/null"
ssh myhost 'sleep 500 >&- 2>&- <&- &'
TMTOWTDI;)Zastąp nazwę swojego procesu bla!
źródło
Osobiście podoba mi się polecenie „partia”.
To umieszcza go w tle, a następnie wysyła wyniki pocztą e-mail. To część crona.
źródło
Jak zauważyli inni, aby uruchomić proces w tle, abyś mógł rozłączyć się z sesją SSH, musisz mieć proces w tle odpowiednio odłączający się od kontrolującego terminala - jest to pseudo-tty, którego używa sesja SSH.
Informacje na temat procesów demonizacji można znaleźć w książkach, takich jak „Advanced Network Program Stevensa, tom 1, 3rd Edn” lub „Advanced Unix Programming” Rochkinda.
Niedawno (w ciągu ostatnich kilku lat) miałem do czynienia z programem opornym, który sam się nie demonizował. Skończyło się na tym, że stworzyłem ogólny program demonizujący - podobny do nohup, ale z większą dostępną kontrolą.
Podwójne myślenie jest opcjonalne w systemach, które nie używają funkcji getopt () GNU; jest to konieczne (lub musisz określić POSIXLY_CORRECT w środowisku) w systemie Linux itp. Ponieważ podwójne myślenie działa wszędzie, najlepiej go używać.
Nadal możesz się ze mną skontaktować (imię i nazwisko kropka nazwisko w gmail kropka com), jeśli chcesz źródła
daemonize
.Jednak kod jest teraz (wreszcie) dostępny na GitHub w moim repozytorium SOQ (Stack Overflow Questions) jako plik
daemonize-1.10.tgz
w podkatalogu paczek .źródło
W systemie opartym na Debianie (na zdalnym komputerze) Zainstaluj:
Stosowanie:
Aby zmienić nazwę sesji:
Aby wyjść z sesji:
(to kończy sesję Tmux). Następnie możesz wylogować się z SSH.
Kiedy musisz wrócić / sprawdzić ponownie, uruchom SSH i wpisz
Zabierze Cię z powrotem do sesji Tmux.
źródło
W przypadku większości procesów można dokonać pseudo-demonizacji przy użyciu tej starej sztuczki wiersza polecenia systemu Linux:
Na przykład:
Następnie uruchom nowe okno terminala i:
Pokaże, że
sleep 30
nadal działa.To, co zrobiłeś, rozpoczęło proces jako dziecko, a kiedy wychodzisz,
nohup
polecenie, które normalnie wyzwalałoby proces wyjścia, nie przechodzi kaskadowo do wnuka, pozostawiając go jako proces osierocony, wciąż działający .Wolę ten „ustaw i zapomnij” podejście, nie ma potrzeby do czynienia z
nohup
,screen
, tmux, I / O przekierowania, czy którykolwiek z tych rzeczy.źródło
Jeśli używasz screena do uruchomienia procesu jako root, uważaj na możliwość ataków z podniesieniem uprawnień. Jeśli twoje konto zostanie w jakiś sposób naruszone, będzie bezpośredni sposób na przejęcie całego serwera.
Jeśli ten proces musi być uruchamiany regularnie i masz wystarczający dostęp do serwera, lepszym rozwiązaniem byłoby użycie crona do uruchomienia zadania. Możesz także użyć init.d (super-demon), aby rozpocząć proces w tle, a może on zakończyć się, gdy tylko się zakończy.
źródło
nohup
jest bardzo dobry, jeśli chcesz zalogować swoje dane do pliku. Ale kiedy przechodzi w tło, nie możesz podać hasła, jeśli twoje skrypty o to proszą. Myślę, że musisz spróbowaćscreen
. jest to narzędzie, które możesz zainstalować w swojej dystrybucji Linuksa za pomocą yum, na przykład na CentOS,yum install screen
a następnie uzyskać dostęp do serwera za pomocą putty lub innego oprogramowania, w swoim typie powłokiscreen
. Otworzy się ekran [0] w szpachli. Wykonuj swoją pracę. Możesz utworzyć więcej screen [1], screen [2] itp. W tej samej sesji szpachlowania.Podstawowe polecenia, które musisz znać:
Aby uruchomić ekran
ekran
Do C Reate następnego ekranu
Ctrl + A + C
Aby przejść do utworzonego ekranu n ext
ctrl + a + n
Do d etach
Ctrl + A + D
Podczas pracy zamknij kit. I następnym razem, gdy zalogujesz się za pomocą typu putty
screen -r
Aby ponownie połączyć się z ekranem, a proces będzie nadal działał na ekranie. Aby wyjść z ekranu, wpisz #exit.
Aby uzyskać więcej informacji zobacz
man screen
.źródło
yum
jest to właściwe narzędzie, gdy nie znasz dystrybucji, nie jest dobre. powinieneś jasno określić, z którymi dystrybucjamiscreen
można zainstalowaćyum
.Nohup pozwala, aby proces klienta nie został zabity, jeśli proces nadrzędny zostanie zabity, jako argument podczas wylogowania. Jeszcze lepiej użyć:
Nohup sprawia, że proces, na który zaczynasz, jest odporny na zakończenie, które twoja sesja SSH i jej procesy potomne są zabijane po wylogowaniu. Polecenie, które wydałem, zapewnia sposób na przechowywanie pid aplikacji w pliku pid, abyś mógł później poprawnie go zabić i pozwolić na uruchomienie procesu po wylogowaniu.
źródło
Użyj ekranu. Jest bardzo prosty w użyciu i działa jak vnc dla terminali. http://www.bangmoney.org/presentations/screen.html
źródło
Jeśli chcesz również uruchamiać aplikacje X - użyj xpra razem z „screen”.
źródło
wybrałbym również program do ekranu (wiem, że jeszcze jedna odpowiedź brzmiała ekran, ale to jest zakończenie)
nie tylko fakt, że &, ctrl + z bg disown, nohup itp. może dać ci przykrą niespodziankę, że kiedy się wylogujesz, zadanie będzie nadal zabijane (nie wiem dlaczego, ale zdarzyło mi się i nie przeszkadzało z tego powodu przestawiłem się na używanie ekranu, ale wydaje mi się, że rozwiązanie anthonyrisinger jako podwójne rozwidlenie rozwiązałoby to), również ekran ma dużą przewagę nad samym uziemieniem:
i btw, to pytanie, którego nigdy nie zadałbym w pierwszej kolejności :) ... używam screena od samego początku robienia czegokolwiek w dowolnym unixie ... i (prawie) NIGDY nie pracuję w powłoce unix / linux bez ekranu startowego po pierwsze ... i powinienem się teraz zatrzymać, albo zacznę niekończącą się prezentację tego, co to jest dobry ekran i co możesz zrobić dla ciebie ... sprawdź to sam, warto;)
źródło
&
(Asynchronous wykonanie) został wprowadzony przez Thompson muszli w 1971 roku , po pierwszej wersji UNIX ... więc dosłownie „od zawsze” ;-) niestety, Byłem zbyt konserwatywny - tak naprawdę minęło 41 lat.Istnieje również komenda daemon pakietu libslack typu open source.
daemon
jest dość konfigurowalny i dba o wszystkie żmudne rzeczy demona, takie jak automatyczne restartowanie, logowanie lub obsługa plików pidfile.źródło
Dołącz ten ciąg do swojego polecenia:> & - 2> & - <& - &. > & - oznacza zamknięcie standardowego wyjścia. 2> & - oznacza zamknij stderr. <& - oznacza zamknij standardowe wejście. i oznacza uruchomienie w tle. Działa to również w celu programowego uruchomienia zadania przez ssh:
źródło
Użyłem polecenia screen. Ten link zawiera szczegółowe informacje, jak to zrobić
https://www.rackaid.com/blog/linux-screen-tutorial-and-how-to/#starting
źródło
Zaakceptowana odpowiedź sugeruje użycie nohup . Wolałbym raczej użyć pm2 . Korzystanie PM2 nad nohup ma wiele zalet, takich jak utrzymywanie aplikacja żywy, utrzymania logów dla aplikacji i wiele więcej innych funkcji. Aby uzyskać więcej informacji, sprawdź to .
Aby zainstalować pm2 , musisz pobrać npm . Dla systemu opartego na Debianie
i dla Redhata
Lub możesz postępować zgodnie z tymi instrukcjami . Po zainstalowaniu npm użyj go, aby zainstalować pm2
Po zakończeniu możesz rozpocząć aplikację
Do monitorowania procesu użyj następujących poleceń:
Zarządzaj procesami przy użyciu nazwy aplikacji lub identyfikatora procesu lub zarządzaj wszystkimi procesami jednocześnie:
Pliki dziennika można znaleźć w
Binarne pliki wykonywalne można również uruchamiać za pomocą pm2. Musisz dokonać zmiany w pliku Jason. Zmień
"exec_interpreter" : "node"
, na"exec_interpreter" : "none".
(patrz sekcja atrybutów ).Kompilowanie powyższego kodu
i uruchom go z np2 w tle
źródło
Na systemd / Linux, systemd-run jest dobrym narzędziem do uruchamiania procesów niezależnych od sesji. Nienawidzący będą nienawiedzieć
źródło