Właśnie przełączyłem się z bash na zsh.
W bash zadania w tle działają dalej po zamknięciu powłoki. Na przykład tutaj, dolphin
kontynuuje działanie po exit
:
$ dolphin .
^Z
[1]+ Stopped dolphin .
$ bg
[1]+ dolphin . &
$ exit
Tego właśnie chcę jako domyślnego zachowania.
W przeciwieństwie do tego zachowanie zsh polega na ostrzeganiu przed uruchomieniem zadań exit
, a następnie zamknięciu ich, jeśli exit
ponownie. Na przykład tutaj, dolphin
jest zamykane, gdy druga exit
komenda faktycznie wychodzi z powłoki:
% dolphin .
^Z
zsh: suspended dolphin .
% bg
[1] + continued dolphin .
% exit
zsh: you have running jobs.
% exit
Jak ustawić domyślne zachowanie zsh, takie jak bash?
setopt nohup
pliku~/.zshrc
. Wtedy uruchomienie polecenia w tle&
zawsze go wyrzeknie. Chociaż domyślnie zsh nadal będzie przypominać ci, że masz uruchomione zadania, gdy próbujesz wyjść. Możesz to również wyłączyć za pomocąsetopt nocheckjobs
.setopt nocheckjobs
robi to, co chcę. Teraz znalazłem dostępne opcje wman zshoptions
. Chciałbym wyłączyć ostrzeżenie. Wiem, kiedy mam procesy w tle i nie potrzebuję tego. Chciałbym, aby zamykał procesy w tle, chyba że zacząłem je odnohup
. Obecnie używam tego z funkcją powłoki, która uruchamia PyCharm w tle znohup
. Kiedy piszępycharm .
, działanohup charm $@ &
. Nie zamyka się, gdy zamykam terminal, ale nadal otrzymuję ostrzeżenie i muszęexit
dwukrotnie wpisać .Z dokumentacji zsh :
Po prostu ustaw
NO_HUP
opcję:% setopt NO_HUP
źródło
I odkryli, że za pomocą kombinacji
nohup
,&
idisown
pracuje dla mnie, ponieważ nie chcę, aby trwale przyczyną pracy do uruchomienia gdy powłoka odszedł.nohup <command> & disown
Chociaż tylko
&
pracował dla mniebash
, znalazłem przy użyciu tylkonohup
,&
czydisown
na prowadzeniu poleceń, jak skrypt, który wywołuje polecenie run java, proces nadal zatrzymać, gdy powłoka jest zakończony.nohup
powoduje, że polecenie ignorujeNOHUP
iSIGHUP
sygnalizuje z powłoki&
sprawia, że proces przebiega w tle w subterminaledisown
po którym następuje argument (indeks numeru zadania na liście zadań) zapobiega wysyłaniu przez powłokęSIGHUP
sygnału do procesów potomnych. Użyciedisown
bez argumentu powoduje, że domyślnie przyjmuje najnowsze zadanie.Znalazłem informacje
nohup
idisown
na tej stronie oraz&
informacje w tej odpowiedzi SO .źródło
Zwykle używam
screen
do utrzymywania pracy w tle.1) Utwórz sesję screenową:
2) Uruchom swoje skrypty, usługi, demony lub cokolwiek innego
3) Zakończ (odłącz) sesję ekranową za pomocą
lub skrót
ALT+A then d
Po kilkuset latach - jeśli chcesz wznowić sesję (podłącz ponownie):
Jeśli chcesz wiedzieć, czy istnieje sesja ekranu, jej nazwę i stan (dołączony lub odłączony):
To rozwiązanie działa na wszystkich interpreterach terminala, takich jak bash, zsh itp. Zobacz także
man screen
źródło