Używam Tilda (rozwijanego terminala) na Ubuntu jako „centrum dowodzenia” - podobnie jak inni mogą używać GNOME Do, Quicksilver lub Launchy.
Mam jednak problem z tym, jak całkowicie odłączyć proces (np. Firefox) od terminala, z którego został uruchomiony - tj. Zapobiec, aby taki (nie) proces potomny
- zostaje zakończone po zamknięciu terminalu źródłowego
- „zanieczyszcza” terminal źródłowy przez STDOUT / STDERR
Na przykład, aby uruchomić Vima w „właściwym” oknie terminala, wypróbowałem prosty skrypt, taki jak poniżej:
exec gnome-terminal -e "vim $@" &> /dev/null &
Jednak nadal powoduje to zanieczyszczenie (również przekazanie nazwy pliku nie wydaje się działać).
Odpowiedzi:
Po pierwsze; po rozpoczęciu procesu możesz go ustawić w tle, najpierw zatrzymując go (hit Ctrl- Z), a następnie pisząc,
bg
aby wznowić działanie w tle. Teraz jest to „zadanie”, a jegostdout
/stderr
/stdin
są nadal podłączone do twojego terminala.Możesz natychmiast rozpocząć proces w tle, dodając na końcu „&”:
Aby uruchomić go w tle wyciszonym, użyj tego:
Niektóre dodatkowe informacje:
nohup
to program, którego można użyć do uruchomienia aplikacji w taki sposób, że jego stdout / stderr może być zamiast tego wysłany do pliku i taki, że zamknięcie skryptu nadrzędnego nie ZWIĘKSZA dziecka. Jednak przed uruchomieniem aplikacji musisz mieć prognozę, aby z niej skorzystać. Ze względu na sposóbnohup
działania nie można go po prostu zastosować do uruchomionego procesu .disown
to wbudowane bash, które usuwa zadanie powłoki z listy zadań powłoki. Zasadniczo oznacza to, że nie możesz już na nim używaćfg
,bg
ale co ważniejsze, gdy zamkniesz skorupę, nie będzie się ona zawieszać ani wysyłaćSIGHUP
do tego dziecka. W przeciwieństwie donohup
,disown
jest używany po uruchomieniu procesu i uruchomieniu go w tle.To, czego nie możesz zrobić, to zmienić stdout / stderr / stdin procesu po jego uruchomieniu. Przynajmniej nie z muszli. Jeśli uruchomisz proces i powiesz mu, że jego stdout jest terminalem (co robisz domyślnie), wówczas proces ten jest skonfigurowany tak, aby wyświetlał dane w terminalu. Twoja powłoka nie ma nic wspólnego z konfiguracją FD procesów, jest to po prostu coś, czym sam proces zarządza. Sam proces może zdecydować, czy zamknąć stdout / stderr / stdin, czy nie, ale nie możesz użyć powłoki, aby to zmusić.
Aby zarządzać danymi wyjściowymi procesu w tle, masz wiele opcji ze skryptów, prawdopodobnie „nohup” jako pierwszy. Ale dla interaktywnych procesów zaczynasz, ale zapomniałeś uciszyć (
firefox < /dev/null &>/dev/null &
), tak naprawdę niewiele możesz zrobić.Polecam dostać GNU
screen
. Za pomocą screena możesz po prostu zamknąć działającą powłokę, gdy wynik procesu staje się kłopotliwy i otworzyć nową (^Ac
).Aha, a przy okazji, nie używaj „
$@
” tam, gdzie go używasz.$@
oznacza$1
,$2
,$3
..., które mogłyby włączyć polecenie na:Prawdopodobnie nie tego chcesz, ponieważ -e bierze tylko jeden argument. Użyj,
$1
aby pokazać, że twój skrypt może obsłużyć tylko jeden argument.Naprawdę trudno jest uzyskać prawidłowe działanie wielu argumentów w scenariuszu, który podałeś (wraz z
gnome-terminal -e
), ponieważ-e
bierze tylko jeden argument, który jest ciągiem poleceń powłoki. Musisz zakodować swoje argumenty w jeden. Najlepszy i najbardziej niezawodny, ale raczej niezbyt gęsty sposób:źródło
disown
, a następnie proces będzie kontynuowany po zamknięciu powłoki, ponieważ bash nie będzie go HUP.$*
zamiast$@
naprawić problemu z oddzielnymi ciągami?reptyr
do tego.nohup
całkowicie odłącza proces (demonizuje go)źródło
nohup
po prostu ignorujeSIGHUP
sygnał. Wykonuje proces normalnie. Bez demonizacji.init
), gdyby powłoka została zamknięta ... prawda?Jeśli używasz
bash
, spróbuj ; patrz bash (1) .disown [jobspec]
Innym podejściem, które możesz wypróbować, jest
at now
. Jeśli nie jesteś superużytkownikiem, twoja zgoda na użycieat
może być ograniczona.źródło
at
delegować egzekucję komuś innemu, podoba mi się! +1zsh
.disown
wydaje się nie mieć pożądany efekt zgnome-terminal
-disown
red procesy są nadal zabity, gdy wyjść terminala. Chciałbym wiedzieć, dlaczego / jak.Czytając te odpowiedzi, miałem początkowe wrażenie, że wydanie
nohup <command> &
będzie wystarczające. Działając zsh w gnome-terminal, odkryłem, żenohup <command> &
nie powstrzymało to mojej powłoki przed zabijaniem procesów potomnych przy wyjściu. Chociażnohup
jest to użyteczne, szczególnie w przypadku nieinteraktywnych powłok, gwarantuje to tylko wtedy, gdy proces potomny nie zresetuje swojego modułu obsługiSIGHUP
sygnału.W moim przypadku
nohup
powinien był uniemożliwić dotarcie do aplikacji sygnałów rozłączenia, ale aplikacja podrzędna (w tym przypadku VMWare Player) resetuje swojąSIGHUP
procedurę obsługi. W rezultacie, gdy emulator terminala zostanie zamknięty, nadal może zabić twoje podprocesy. O ile mi wiadomo, można to rozwiązać tylko poprzez usunięcie procesu z tabeli zadań powłoki. Jeślinohup
zostanie zastąpione przez wbudowaną powłokę, jak to czasami bywa, może to jednak wystarczyć w przypadku, gdy nie jest to ...disown
Powłoka jest wbudowane wbash
,zsh
iksh93
,lub
jeśli wolisz jednowarstwowe. Ma to ogólnie pożądany efekt usunięcia podprocesu z tabeli zadań. Umożliwia to wyjście z emulatora terminala bez przypadkowego sygnalizowania procesu potomnego. Bez względu na to,
SIGHUP
jak wygląda program obsługi, nie powinno to zabić Twojego procesu potomnego.Po odrzuceniu proces jest nadal dzieckiem emulatora terminala (pobaw się,
pstree
jeśli chcesz obejrzeć to w akcji), ale po wyjściu emulatora terminala powinieneś zobaczyć, że jest on dołączony do procesu init. Innymi słowy, wszystko jest tak, jak powinno być i jak zapewne chcesz.Co zrobić, jeśli twoja powłoka nie obsługuje
disown
? Zdecydowanie opowiadam się za przejściem na taki, który ma taką możliwość, ale przy braku tej opcji masz kilka możliwości.screen
itmux
mogę rozwiązać ten problem, ale są to rozwiązania znacznie cięższe i nie lubię ich uruchamiać do tak prostych zadań. Są one znacznie bardziej odpowiednie w sytuacjach, w których chcesz zachować tty, zwykle na zdalnym komputerze.setopt nohup
. Można tego użyć, aby określić, żeSIGHUP
nie należy wysyłać do zadań w tabeli zadań po wyjściu powłoki. Możesz albo zastosować to tuż przed wyjściem z powłoki, albo dodać ją do konfiguracji powłoki, tak~/.zshrc
jakbyś zawsze tego chciał.tcsh
lubcsh
, co jest nieco niepokojące.exec()
. To bardzo słabe rozwiązanie, ale źródło powinno składać się z kilkudziesięciu wierszy. Następnie można przekazać polecenia jako argumenty wiersza polecenia do programu w języku C, a tym samym uniknąć wpisu specyficznego dla procesu w tabeli zadań.źródło
nohup $COMMAND &
$COMMAND & disown
setsid command
Używam numeru 2 od bardzo dawna, ale numer 3 działa równie dobrze. Ponadto,
disown
posiadanohup
flagę-h
, może wyprzeć wszystkie procesy z-a
, a może wyprzeć wszystkie procesy uruchomione z-ar
.Uciszenie jest realizowane przez
$COMMAND &>/dev/null
.Mam nadzieję że to pomoże!
źródło
Myślę, że ekran może rozwiązać twój problem
źródło
w tcsh (i być może także w innych powłokach) możesz użyć nawiasów, aby odłączyć proces.
Porównaj to:
Do tego:
To usuwa firefoxa z listy zadań, ale nadal jest powiązany z terminalem; jeśli zalogowałeś się do tego węzła przez 'ssh', próba wylogowania nadal zawiesza proces ssh.
źródło
Najprostsza i jedyna poprawna odpowiedź na bash:
Nie musisz odłączać procesu od terminala, ale od powłoki.
źródło
Aby oddzielić powiązanie powłoki tty, uruchom polecenie przez podpowłokę np
(Komenda)&
Po wyjściu używany terminal jest zamknięty, ale proces jest nadal aktywny.
sprawdź -
Otwórz inny terminal
Proces wciąż trwa.
źródło
Tworzenie tła i planowanie zadania jest prawdopodobnie jedną z pierwszych rzeczy, o których powinien wiedzieć każdy administrator systemu Unix.
Oto jak to się robi z bash:
źródło
Możesz uruchomić polecenie za pomocą polecenia nohup, to odłączy proces i przekieruje dane wyjściowe do danego pliku ... ale nie jestem pewien, czy dokładnie tego potrzebujesz.
źródło
Wypróbuj demona - powinien być dostępny od przyjaznego menedżera pakietów i kompleksowo zadbać o każdy sposób odłączenia się od terminala.
źródło
Po prostu dodaj to do swojego bashrc / zshrc:
Następnie możesz uruchomić odrzucone polecenia w następujący sposób:
źródło
W moim .bashrc mam te funkcje właśnie w tym celu:
Prefiks polecenia,
dos
aby uruchomić go odłączony od terminala.Funkcja jest napisana do pracy z
bash
izsh
.źródło
( "$@" & disown) &> /dev/null
. Nie ma też większego sensu w użyciu,1>
a2>
ponieważ używaszdisown
, co oznacza, że używasz bash, a w bash możesz po prostu zrobić&>
przekierowanie zarówno stdout, jak i stderrrun_disowned
funkcjonalności w innych miejscach w moich plikach dot. Oczywiście masz rację&>
.W systemie Mac OS X znalazłem, że muszę używać zarówno nohup AND disown, aby upewnić się, że proces potomny nie zostanie zerwany z terminalem.
źródło
Aby to zrobić, używam następującego skryptu. Zatrzymuje drukowanie procesu do terminala, odłącza się
nohup
i kończy ze statusem powrotu, jeśli polecenie zakończy się w ciąguTIMEOUT
.Przykład użycia:
źródło
sudo apt install ucommon-utils
pdetach command
Proszę bardzo :)
źródło
Wiele odpowiedzi sugerowało 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
źródło
nohup
jest zwykłym standardowym poleceniem POSIX, więc ta sama uwaga: nie ma mowy, żeby był przestarzały. @see unix.com/man-page/posix/1p/nohupJeśli Twoim celem jest po prostu uruchomienie aplikacji wiersza polecenia bez pozostawiania okna terminala, możesz spróbować uruchomić aplikację po uruchomieniu terminalu z alt-F2.
źródło