Często używam bashskryptów powłoki do uruchamiania prostych poleceń dla wielu różnych plików. Na przykład załóżmy, że mam następujący bashskrypt o nazwie script.sh, która uruchamia program / komendę foona 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ć, nohupaby 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 topto widzę tylko fooodpowiadające "a.txt". Mogę zakończyć to foopołączenie, ale następnie zostaje wywołane fooodpowiadają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 forpętli przerywanie każdego z foonich 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 myusernamejest 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
nohupminie dużo czasu, zanim pojawi się lista procesów, aby zobaczyć rozpoczęte zadanie. Możesz spojrzeć na kolumnę „nicość” w danych pswyjściowych, ale odpowiedzi tutaj są bardziej przydatne.