Rozważ następujące nohupwykonanie:
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 nohupwykonanie:
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 tmuxlub 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 ignorowanySIGHUPi przekierowujestdout/stderrdo plikunohup.out, dzięki czemu polecenie może być dalej uruchomione w tle po wylogowaniu.
nohupnie 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’
jobsmoże wydrukować aktualnie uruchomione zadania i ich status. Jeśli polecenie jobsnie 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, fgnawet 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 initprocesu. 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ć sleeppracę z tym samym PID wydrukowanym podczas jego odradzania, a jobsnic 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.