Muszę skonfigurować moje zadanie wsadowe bash (kompresowanie plików 5.1k na miejscu), aby jeśli trzeba było zatrzymać / wznowić zadanie, poczekał, aż znajdzie się ono „między” plikami (właśnie skończył jeden i nie uruchomił innego).
Moja kompresja wyglądałaby tak, pigz -9 -- rsnc*
jakby wszystkie działały jednocześnie, i zastanawiałem się nad czymś takim:
ls rsnc* | while read file
do pigz -9 -- $file
if [ -f .intr ]
then break
fi
done
Czy to niezawodny sposób na osiągnięcie mojego celu? Czy jest lepszy sposób?
Ctrl-Z
. Odpowiada numerem zadania (na przykład [3]) na liście zadań. Następnie możesz go wznowić za pomocą%3
.Odpowiedzi:
Można
trap
[ 1 ], [ 2 ]Ctrl + Csygnał INT jeden, await
na zakończenie każdego procesu.Uwaga
Istnieje wiele sposobów przełączania wszystkich plików w katalogu [ 3 ] , ale zawsze lepiej jest unikać analizowania danych wyjściowych
ls
[ 4 ] .Bibliografia
źródło
ls
, choć w tym przypadku wszystkie nazwy plików są znane. Zastanawiam się, dlaczego tło, apigz
następnie czekać na to? czy uruchomienie pigz na pierwszym planie nie przyniosłoby tego samego?$!
Jest również ogólnie ostatnim argumentem do poprzedniego polecenia, czy to oznacza coś jeszcze tutaj?pigz
3. Nie$!
zwraca PID ostatniego polecenia wykonanego w tle (&
).wait $!
zrób to samo z prostegowait
. Oczywiście będzie inaczej, jeśli chcesz uruchomić n czasu równoległegopigz
na różnych plikach i poczekać, aż liczba procesów potomnych będzie mniejsza niż n . (Nie będziesz potrzebować więcejwait $!
niż kolejny cykl, z testem i snem ...).pigz
Trwa to, jeśli chcesz uruchomić kilka równolegle i poczekać na ostatnią. ps> możesz złapać inny sygnał, jeśli wolisz ...!$
. Tak, nie mogę działaćpigz
równolegle, ponieważ używa już wszystkich moich rdzeni na poszczególnych plikach (ale na pewno jest szybki); ale to nie jest problem z twoją odpowiedzią, tylko niektóre informacje. Pomyślałem, że skoro przewodnikINT
woławait
, żepigz
na pierwszym planie wciąż będzie czekać, a nie minieINT
? Nie próbując sugerować, że się mylisz, po prostu mile widziane byłoby dodatkowe wyjaśnienie przepływu kontroli.help wait
gdy mówi: Jeśli identyfikator nie zostanie podany, czeka na wszystkie aktualnie aktywne procesy potomne i status zwrotu ... wydaje się sugerować, że jeśli nie jest w tle&
lub w podpowłoce()
, nie jest dziecko jeden i nie należy się spodziewać, żewait
będzie czekać na niego. Możesz przetestować (to ciekawe). ps> Możesz złapać w pułapkę nawet inny sygnał, jeśli chcesz ... a od systemu do systemu może zmieniać nazwę sygnału (zwyklekill -l
dla listy).