Przenieś pracę na pierwszym planie

14

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?

Adam Matan
źródło

Odpowiedzi:

7

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

Gus E.
źródło
+1 Doskonałe narzędzie, o którym nie wiedziałem. Wielkie dzięki.
Adam Matan
19

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.

souravc
źródło
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).
Ruslan
4

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:

djeikyb
źródło
0

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
dezorientować
źródło
0

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.

Sudip Bhandari
źródło