Rozważ następujące nohup
wykonanie:
nohup script.sh > script.out &
Czy istnieje sposób na wylogowanie się z terminala, ponowne połączenie, przywrócenie procesu na pierwszy plan i interakcję z nim za pomocą klawiatury?
Rozważ następujące nohup
wykonanie:
nohup script.sh > script.out &
Czy istnieje sposób na wylogowanie się z terminala, ponowne połączenie, przywrócenie procesu na pierwszy plan i interakcję z nim za pomocą klawiatury?
Odpowiedzi:
Jeśli chcesz uruchomić skrypt, niech uruchomi się go bez problemów na terminalu, a następnie uruchom go w celu interakcji z nim, możesz rzucić okiem na multiplekser terminali. W zależności od systemu polecam tmux
lub screen
. Informacje na temat korzystania z nich można znaleźć w poniższych linkach:
tmux:
ekran:
edycja: dodano linki do starterów tmux
nohup nie odłącza polecenia od terminala, powoduje, że skrypt jest ignorowanySIGHUP
i przekierowujestdout/stderr
do plikunohup.out
, dzięki czemu polecenie może być dalej uruchomione w tle po wylogowaniu.
nohup
nie umieszcza automatycznie polecenia w tle. Trzeba to zrobić jawnie, kończąc linię poleceń znakiem &
.
$ nohup ./script.sh &
[1] 3390
$ nohup: ignoring input and appending output to ‘nohup.out’
jobs
może wydrukować aktualnie uruchomione zadania i ich status. Jeśli polecenie jobs
nie może go znaleźć, to nie jest już procesem potomnym tej powłoki.
$ jobs
[1]+ Running nohup ./script.sh &
Można przywrócić zadanie tła na pierwszy plan w trybie bash, fg
nawet jeśli jest ono uruchomione nohup
. Ale to nie zmieni przekierowania wyjściowego, które nadal będzie przechodzić do plikunohup.out
.
$ fg
nohup ./script.sh
Jeśli zamkniesz powłokę / terminal lub wylogujesz się, twoje polecenie nie będzie już potomkiem tej powłoki. Należy do init
procesu. Jeśli przeszukasz pstree
, zobaczysz, że jest teraz własnością procesu 1 ( init
). Tego nie można przywrócić na pierwszy plan, ponieważ pierwszy plan już nie istnieje.
If the command jobs cannot find it, then it is no longer a child process of that shell.
To jest złe: spróbuj tę sekwencję, aby zobaczyć, jak: sleep 100 & disown ; echo Jobs:; jobs; echo Tree:; pstree -ap $$
. Po tym poleceniu nadal będziesz widzieć sleep
pracę z tym samym PID wydrukowanym podczas jego odradzania, a jobs
nic nie wydrukuje. Jedynym sposobem, w jaki proces potomny może przestać być dzieckiem, jest utrata rodzica (wtedy sierota staje się dzieckiem init
) lub rozwidlenie + wyjście (ale wtedy zmienia się PID, więc nie jest to pierwotne dziecko).
Poproszę użycie terminala, ale tmux , a nie screen. Ekran jest, dla wszystkich celów i celów, niezachowany. Jego konfiguracja jest mroczną sztuką, prawdopodobnie po raz pierwszy zapisaną w dodatku do Necronomicon. Próba napisania własnej konfiguracji jest jak rzut oka na Cthulu. Poważnie. Rozejrzyj się za plikami .screenrc . Dla pewności istnieją sposoby na mediację wstrętem do pliku konfiguracyjnego. Byobu wykonuje godną podziwu pracę jako zasłona między śmiertelnymi użytkownikami i bezbożnym kodem. Ma rozsądne kolory, interfejs menu i, co najważniejsze, pasek stanu.
Ale jak powiedziałem, zamiast tego polecam tmux . Nadal wymaga niewielkiej konfiguracji, ale jest dobrze udokumentowany , a plik konfiguracyjny nie będzie wyglądał jak bełkot. Zaczynasz też od kolorów i paska stanu. Porównaj moje pliki screenrc i tmux.conf:
Jeśli interesuje Cię tylko wygląd czapki na żywo, może ci to odpowiadać:
nohup script.sh 2>&1 script.out &
# later:
tail -f script.out
Każde polecenie Linuksa można wysłać w tle z &
dołączonym na końcu „”.
Aby wyświetlić wszystkie zadania w tle, możesz wystawić jobs
jobs
[1] + suspended nohup sh zookeeper-server-start.sh ../config/zookeeper.properties
[2] running nohup sh kafka-server-start.sh ../config/server.properties
[3] - running nohup sudo mongod --dbpath=/var/lib/mongodb
Tutaj prowadzę 3 zadania w tle: Zookeeper, Kafka i Mongo Daemon. [1], [2] i [3] są odpowiednimi numerami zadań dla tych zadań.
Możesz przenieść te zadania na pierwszy plan, używając fg %$taskNumber.