Często używam bash
skryptów powłoki do uruchamiania prostych poleceń dla wielu różnych plików. Na przykład załóżmy, że mam następujący bash
skrypt o nazwie script.sh
, która uruchamia program / komendę foo
na trzy pliki tekstowe "a.txt"
, "b.txt"
, "c.txt"
:
#!/bin/bash
for strname in "a" "b" "c"
do
foo $strname".txt"
done
Załóżmy również, że foo $strname".txt"
jest to powolne, więc wykonanie skryptu zajmie dużo czasu (na przykład godziny lub dni). Z tego powodu chciałbym użyć, nohup
aby wykonanie było kontynuowane, nawet jeśli terminal jest zamknięty lub odłączony. Chciałbym również, aby skrypt natychmiast przeszedł w tło, więc użyję &
operatora. Dlatego użyję następującego polecenia do wywołania script.sh
:
nohup bash script.sh &
Działa to dobrze w przypadku uruchamiania skryptu w tle i bez rozłączania, ale teraz załóżmy, że z jakiegoś powodu chciałbym zakończyć wykonywanie w pewnym momencie. W jaki sposób mogę to zrobić?
Problem, który napotkałem, polega na tym, że patrząc na top
to widzę tylko foo
odpowiadające "a.txt"
. Mogę zakończyć to foo
połączenie, ale następnie zostaje wywołane foo
odpowiadające mu polecenie, "b.txt"
a następnie muszę je również zakończyć i tak dalej. W przypadku dziesiątek lub setek plików tekstowych określonych w for
pętli przerywanie każdego z foo
nich staje się trudne ! Więc jakoś muszę zamiast zakończyć skrypt sam , a nie poszczególne połączenia wydane ze skryptu powłoki.
Kiedy wpisuję polecenie
ps -u myusername
gdzie myusername
jest moja nazwa użytkownika, otrzymuję listę uruchomionych procesów. Ale widzę dwa różne identyfikatory procesów o nazwie bash
. Skąd mam wiedzieć, który z tych procesów, jeśli w ogóle, odpowiada mojemu pierwotnemu wezwaniu nohup bash script.sh &
?
for s in a b c; do foo "$s".txt; done
nohup
minie dużo czasu, zanim pojawi się lista procesów, aby zobaczyć rozpoczęte zadanie. Możesz spojrzeć na kolumnę „nicość” w danychps
wyjściowych, ale odpowiedzi tutaj są bardziej przydatne.Odpowiedzi:
Domyślnie
ps
nie wyświetla parametrów, z którymi program został wywołany. Opcje-f
i-l
oba pokażą pełne połączenie.spowoduje wyjście, które wygląda następująco:
źródło
Masz kilka opcji. Ponieważ proces działa w tle, możesz
jobs
go znaleźć:Możesz także użyć
pkill
do przeszukiwania tabeli procesów w celu dopasowania wiersza poleceń; mianowicie:źródło
Dane
ps
wyjściowe (np.ps aux
) Obejmują identyfikator procesu rodzica. Zabij rodzicabash
, a jego dzieci również zostaną rozwiązane.Aby uzyskać wizualizację drzewa procesów ASCII, spróbuj
pstree -p
uruchomić kilka procesów w tle.źródło