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 danych ps
wyjściowych, ale odpowiedzi tutaj są bardziej przydatne.