Chcę uruchomić wiele poleceń (procesów) na jednej powłoce. Wszystkie z nich mają swoją ciągłą wydajność i nie przestawają. Uruchamiając je w przerwach tła Ctrl- C. Chciałbym uruchomić je jako pojedynczy proces (może podpowłoka?), Aby móc zatrzymać je wszystkie za pomocą Ctrl- C.
Mówiąc ściślej, chcę uruchomić testy jednostkowe w mocha
(tryb oglądania), uruchomić serwer i uruchomić wstępne przetwarzanie plików (tryb oglądania) i zobaczyć dane wyjściowe każdego z nich w jednym oknie terminala. Zasadniczo chcę uniknąć używania programu uruchamiającego zadania.
Mogę to zrealizować, uruchamiając procesy w tle ( &
), ale potem muszę je umieścić na pierwszym planie, aby je zatrzymać. Chciałbym mieć proces ich owijania, a kiedy zatrzymam proces, zatrzyma to jego „dzieci”.
źródło
Odpowiedzi:
Aby uruchamiać polecenia jednocześnie, możesz użyć
&
separatora poleceń.Rozpocznie się
command1
, a następnie uruchomi w tle. To samo zcommand2
. Potem zaczyna sięcommand3
normalnie.Dane wyjściowe wszystkich poleceń będą zniekształcone, ale jeśli nie będzie to dla ciebie problemem, to będzie rozwiązanie.
Jeśli chcesz osobno spojrzeć na dane wyjściowe później, możesz potokować dane wyjściowe każdego polecenia do
tee
, co pozwala określić plik, do którego ma być dublowany wynik.Dane wyjściowe będą prawdopodobnie bardzo nieporządne. Aby temu przeciwdziałać, możesz nadać wyjściu każdego polecenia prefiks
sed
.Jeśli więc połączymy to wszystko razem, otrzymamy:
To wysoce wyidealizowana wersja tego, co prawdopodobnie zobaczysz. Ale to najlepsze, o czym mogę teraz myśleć.
Jeśli chcesz zatrzymać je wszystkie naraz, możesz skorzystać z wbudowanej wersji
trap
.Będzie to wykonać
command1
, acommand2
w tle icommand3
w, co pozwala zabić go na pierwszym planie Ctrl+ C.Po zabiciu ostatniego procesu z Ctrl+ Cte
kill %1; kill %2
polecenia są wykonywane, ponieważ ich wykonanie połączone z odbiorem sygnału, a INTerupt rzeczy wysłanego przez naciśnięcie Ctrl+ C.Odpowiednio zabijają pierwszy i drugi proces w tle (twój
command1
icommand2
). Nie zapomnij usunąć pułapki po zakończeniu korzystania z poleceńtrap - SIGINT
.Ukończ potwora polecenia:
Możesz oczywiście spojrzeć na ekran . Pozwala podzielić konsolę na tyle oddzielnych konsol, ile chcesz. Możesz więc monitorować wszystkie polecenia osobno, ale jednocześnie.
źródło
Możesz łatwo zabić kilka procesów naraz, jeśli zorganizujesz je (i tylko one) w tej samej grupie procesów .
Linux zapewnia narzędzie
setsid
do uruchamiania programu w nowej grupie procesów (nawet w nowej sesji, ale nas to nie obchodzi). (Jest to wykonalne, ale bardziej skomplikowane bezsetsid
.)Identyfikator grupy procesów (PGID) grupy procesów jest identyfikatorem pierwotnego procesu nadrzędnego w grupie. Aby zabić wszystkie procesy w grupie procesów, przekaż ujemną wartość PGID do
kill
wywołania systemowego lub polecenia. PGID pozostaje ważny, nawet jeśli pierwotny proces z tym PID umrze (choć może to być nieco mylące).Jeśli uruchomisz procesy w tle z nieinteraktywnej powłoki, wszystkie one pozostaną w grupie procesów powłoki. Tylko w interaktywnych powłokach procesy w tle działają we własnej grupie procesów. Dlatego jeśli rozwidlisz polecenia z nieinteraktywnej powłoki, która pozostaje na pierwszym planie, Ctrl+ Czabije je wszystkie. Użyj
wait
wbudowanego polecenia, aby powłoka czekała na zakończenie wszystkich poleceń.źródło
Dziwię się, że jeszcze go tu nie ma, ale moim ulubionym sposobem jest użycie podpowłoki z poleceniami w tle. Stosowanie:
(command1 & command2 & command3)
Dane wyjściowe są widoczne z obu, wszystkie polecenia bash i udogodnienia są nadal dostępne, a jeden Ctrl-czabija je wszystkie. Zwykle używam tego, aby jednocześnie uruchomić serwer plików klienta do debugowania na żywo i serwer zaplecza, dzięki czemu mogę je łatwo zabić, kiedy chcę.
Działa to w ten sposób
command1
icommand2
działają w tle nowej instancji podpowłoki icommand3
znajdują się na pierwszym planie tej instancji, a podpowłoka jest tym, co najpierw odbiera sygnał zabicia od Ctrl-cnaciśnięcia klawisza. To bardzo przypomina uruchamianie skryptu bash w odniesieniu do tego, kto jest właścicielem danego procesu i kiedy programy w tle zostają zabite.źródło
wait
jako ostatnie polecenie (polecenie 3 w twoim przykładzie), możesz wykonać kod czyszczenia po naciśnięciu przez użytkownika Ctrl-c.Możesz użyć średnika
;
lub w&&
ten sposób:źródło
Możesz użyć
pipe
. Spowoduje to uruchomienie poleceń na obu końcach potoku w tym samym czasie. Powinieneś być w stanie zatrzymać wszystkie polecenia za pomocąCTRL-C
.1st command | 2nd command | 3rd command
Jeśli chcesz uruchamiać polecenia jeden po drugim, możesz użyć metody @ serenesat.
źródło