Załóżmy, że uruchomiłeś nową aplikację w Linuksie (np. Edytor tekstu itp.), Ale zapomniałeś użyć „&”. Jakich poleceń użyłbyś, aby ten proces działał w tle, a jednocześnie NIE musiał zamykać tej aplikacji? W ten sposób możesz mieć otwarte i oddzielnie działające procesy (np. Terminal wiersza poleceń użyty do utworzenia procesu, a proces taki jak edytor tekstu nadal działa.
24
tmux
zapewnia taką samą funkcjonalność, jak pożądana w pytaniu.Odpowiedzi:
W oknie terminala zwykle należy wpisać Control+, Zaby „zawiesić” proces, a następnie użyć
bg
polecenia, aby „w tle” go.np. z poleceniem uśpienia
Widzimy, że proces jest uruchomiony i nadal mam swoją linię poleceń.
źródło
fg
polecenia, które przyjmuje1
jako parametr identyfikator zadania ( w tym przypadku podany w nawiasach kwadratowych ). Nie jest on specyficzny dla użyciabg
i można to zrobić w procesach uruchomionych za pomocą&
.Ctrl+ Zjest sposobem, aby to zrobić, ale tylko dla kompletności: pytanie wymaga „polecenia”, a byłoby to (z innego terminala):
a potem oczywiście
z terminala aplikacji.
źródło
W Bash:
Ctrl+ Za następnie
bg
.Teraz uruchom
jobs
i zobacz wynik.źródło
/bin/sh
więc to by nie działało :-)Jako środek zapobiegawczy związany z niedogodnością związaną z koniecznością naciskania CTRL- zmożesz utworzyć skrypt opakowujący dla swojego edytora, który uruchamiałby twój edytor w tle. W ten sposób nie będziesz musiał pamiętać o uruchomieniu go w tle:
Powyżej próbujemy najpierw ustalić, czy masz dostępny serwer X, a dopiero potem uruchomić edytor w tle (jeśli nie, wielu edytorów uniksowych zamiast tego użyje twojego terminala i w tym przypadku nie chcesz uruchamiać edytora jako procesu w tle) . Prześle wszystkie argumenty do edytora wyboru verbatim (
"$@"
), tak jak podałeś dla skryptu opakowania.Jeśli chodzi o polecenie, którego brakuje ... Na podstawie mojego podstawowego eksperymentu, dla programów GUI, które nie wymagają terminala, może to być tak proste, jak najpierw wysłanie,
SIGSTOP
a następnieSIGCONT
przejście do pierwszego planu (użyciekill
polecenia, jeśli używasz skryptu powłoki, aby to zaimplementować) . Oczywiście musiałbyś uruchomić go w innym oknie / zakładce terminala, a trudność polegałaby na wygodnym i ogólnym znalezieniu PID, do którego chcesz wysłać swój sygnał. Możesz domyślnie wysłać dwa sygnały do wszystkich procesów o podanej nazwie (domyślnie do twojego ulubionego edytora i pozwalając również używać PID jako argumentów):Ta metoda poprawnie dała mi karty terminalu po uruchomieniu (kilku)
emacs
poleceń w tle. Ale proces emacs działający w terminalu nie został poprawnie przywrócony z powodu kontroli zadań powłoki lub pomyłki w ustawieniach terminala. Ta metoda skorzystałaby z pewnego wyrafinowania.To
SIGSTOP
jest dokładnie to, co jest wysyłane do procesu pierwszego planu po naciśnięciu (według typowych ustawień domyślnych) CTRL- z. Sprawdźstty -a
dane wyjściowe(wyjście skrócone) i
stty
strona podręcznika:Procesy zatrzymane za pomocą
SIGSTOP
sygnału można ponownie uruchomić, wysyłającSIGCONT
. Zwykle jest to logika kontroli zadania powłoki, która wyśleSIGCONT
i zajmie się innymi niezbędnymi manipulacjamifg
ibg
poleceniami, które ignorujemy.źródło