Utworzyłem skrypt PowerShell, który kopiuje wszystkie e-książki, które pobieram do z góry określonego katalogu, który jest okresowo skanowany przez mojego menedżera e-booków i dodawany do mojej biblioteki. Skrypt jest uruchamiany natychmiast po każdym pobraniu.
Problem polega na tym, że gdy kilka książek jest pobieranych jednocześnie lub mniej więcej w tym samym czasie, menedżer e-booków blokuje się i przestaje odpowiadać.
Dlatego chciałbym umieścić w kolejce kopiowanie za pomocą zadań PowerShell, ale nie wiem, jak utworzyć pojedynczą kolejkę (pojedynczą współbieżność), aby każde kolejne zadanie czekało na zakończenie każdego starszego zadania.
To znaczy, chciałbym, aby skrypt utworzył zadanie (nazwijmy to „Book Job”), które okresowo sprawdza kolejkę uruchamiania Book Job, aby sprawdzić, czy wszystkie starsze Book Jobs zakończyły się przed jego uruchomieniem. Po zakończeniu zadanie Job Book powinno oświadczyć, że zostało ukończone w sposób, który może zostać wykryty przez młodsze Book Job.
Czy ktoś wie, jak to zrobić? Widziałem tutaj podobne pytanie, na które patrzę: zadania w tle PowerShell , jednak w moim przypadku uruchamiam skrypt wiele razy (po każdym nowym pobraniu).
źródło
Odpowiedzi:
Moim pomysłem jest ustanowienie kolejki poprzez utworzenie jednego pliku blokady na nowe wystąpienie skryptu. Po uruchomieniu skryptu sprawdza katalog poświęcony śledzeniu kolejki dla istniejących instancji skryptu. Jeśli ich nie ma, skrypt dodaje się na początku kolejki, wykonuje akcję (uruchamia kod), a następnie czyści blokadę. Jeśli są blokady, nowa zostanie dodana na końcu kolejki, a instancja będzie bez końca sprawdzać, aż znajdzie się na początku kolejki.
Pozwala to na uruchomienie tego samego skryptu wiele razy, a każdy z nich sam sobie radzi, sprawdzając dostępną zewnętrznie kolejkę.
Pliki blokady mają strukturę indeksu, separatora („_”), identyfikatora procesu.
Poniżej znajduje się fikcyjny przykład na osi czasu, w którym pobrałeś trzy pliki (wybrałem losowe PID).
do/until
i sprawdzimy, aż do pierwszego szeregu.To rozwiązanie nie jest kuloodporne, ale może działać w zależności od skali.
źródło