Workiva Scripting automatycznie monitoruje zasoby wykorzystywane przez każde uruchomienie skryptu, w tym pamięć, procesor, użycie dysku i czas wykonania. Gdy skrypt przekroczy skonfigurowane limity zasobów, funkcja Scripting podejmie próbę jego bezpiecznego zatrzymania, zapewniając jednocześnie stabilność platformy. Ponadto system daje skryptom czas na wyczyszczenie się i zamknięcie, zanim zostaną całkowicie zatrzymane, co minimalizuje zakłócenia dla użytkowników.
W tym artykule wyjaśniono, w jaki sposób skrypty radzą sobie ze scenariuszami zakończenia, jakie szczegóły pojawiają się w dziennikach i zamieszczono zrzuty ekranu.
Aby uzyskać szczegółowe informacje na temat wszystkich ograniczeń systemu, zobacz Limity skryptów Workiva .
Scenariusze
| Scenariusz | Zachowanie | Szczegóły dziennika |
| Bardzo krótki okres | Udany bieg | Nie zarejestrowano danych o wykorzystaniu zasobów |
| Normalne zakończenie | Udany bieg | Zarejestrowano pełne podsumowanie wykorzystania zasobów (chyba że jest zbyt krótkie, aby je pobrać) |
| Przekroczenie limitu pamięci | Łagodne zakończenie | Wyświetla przekroczony próg pamięci, pokazuje średnie i szczytowe wykorzystanie |
| Przekroczono limit dysku | Łagodne zakończenie | Wyświetla przekroczony próg dysku, pokazuje średnie i szczytowe wykorzystanie |
| Przekroczenie przydzielonego czasu | Łagodne zakończenie | Wyświetla przekroczony czas wykonania i całkowity wykorzystany czas |
| Anulowanie ręczne | Łagodne zakończenie | Pełne wydanie zasobów, zarejestrowano podsumowanie zasobów |
| Nieoczekiwane zakończenie | Niestosowne zakończenie umowy | Zarejestrowano częściowe lub niekompletne dane dotyczące użytkowania |
Dzięki automatycznemu egzekwowaniu limitów zasobów i udostępnianiu szczegółowych dzienników (jak pokazano na zrzucie ekranu poniżej), Workiva Scripting gwarantuje niezawodność platformy i przejrzystość dla programistów tworzących i optymalizujących skrypty automatyzacji.
Zakończenie, gdy przebieg zakończy się pomyślnie
Gdy skrypt zostanie wykonany prawidłowo i nie przekroczy limitów, w dzienniku zostanie wyświetlone podsumowanie wykorzystania zasobów ], pokazujące średnie i szczytowe wykorzystanie pamięci, procesora, dysku oraz czasu wykonywania. Informacje te zapewniają wgląd w charakterystykę wydajności pomyślnie zakończonych przebiegów.
Uwaga: Jeśli skrypt działa bardzo szybko (na przykład krócej niż jedną sekundę), próbkowanie zasobów może nie nastąpić. W takich przypadkach w dzienniku nie będą rejestrowane żadne dane dotyczące wykorzystania zasobów.
Skrypt działa zbyt szybko, aby go pobrać
Jeśli skrypt zakończy się zbyt szybko, monitor nie będzie mógł przechwycić danych dotyczących użytkowania.
Skrypt ma normalne wyjście
Jeśli skrypt zostanie ukończony bez przekroczenia żadnych limitów, w dzienniku zostaną wyświetlone pełne statystyki wykorzystania zasobów.
Zakończenie umowy w przypadku przekroczenia limitów
Jeśli uruchomienie skryptu przekroczy skonfigurowane limity (na przykład pamięć, użycie dysku lub przydzielony czas), wykonywanie skryptów spowoduje:
- Próba bezpiecznego zatrzymania skryptu — po przekroczeniu limitów funkcja Scripting najpierw wysyła sygnał zakończenia (SIGTERM), aby skrypt mógł się wyczyścić i zakończyć działanie w ciągu 15 sekund.
- Jeżeli skrypt nie zakończy działania w ciągu 15 sekund, skrypt wysyła sygnał SIGKILL, który natychmiast zatrzymuje proces i nie pozwala na wykonanie żadnego czyszczenia. Jest to wymuszone zakończenie, a proces zakończy się niepowodzeniem (wyświetlanym w dzienniku na czerwono). Ten status oznacza, że skrypt przekroczył skonfigurowany limit zasobów i został przymusowo zakończony.
- Zapisz przyczynę zatrzymania — w dzienniku pojawi się informacja o przekroczeniu limitu i podsumowanie wykorzystania zasobów przez skrypt.
W kolejnych sekcjach znajdziesz przykłady tego, co się dzieje, gdy skrypt przekracza limity, a nie ma kodu obsługującego te sygnały. Aby dowiedzieć się, jak modyfikować skrypty, aby odpowiednio reagowały na te sygnały, zapoznaj się z tematem Obsługa sygnałów systemowych w skryptach .
Przekroczono limit pamięci
Gdy skrypt przekroczy skonfigurowany limit pamięci, w dzienniku zostanie uwzględniony powód zakończenia skryptu oraz szczegóły dotyczące przekroczenia progu.
Przekroczono limit wykorzystania dysku
Gdy skrypt przekroczy skonfigurowany limit wykorzystania dysku, w dzienniku zapisywane są powód zakończenia działania skryptu oraz szczegóły dotyczące wykorzystania dysku w momencie osiągnięcia limitu.
Przekroczono przydzielony czas
Gdy skrypt przekroczy skonfigurowany, przydzielony czas, w dzienniku zapisany zostanie powód zakończenia oraz całkowity zarejestrowany czas wykonania.
Zakończenie, gdy użytkownik anuluje przebieg
Jeśli użytkownik ręcznie anuluje wykonanie skryptu, Scripting najpierw wysyła sygnał przerwania (SIGINT), aby poinformować skrypt, że powinien się zatrzymać. Skrypt ma 15 sekund na wyczyszczenie, zapisanie postępu lub wycofanie przed zamknięciem. Po upływie 15 sekund następuje ta sama sekwencja, którą opisano powyżej: wysyłany jest sygnał zakończenia (SIGTERM), aby dać skryptowi kolejne 15 sekund na dokończenie czyszczenia, a następnie wysyłany jest ostateczny sygnał zakończenia (SIGKILL), jeśli skrypt nadal nie zostanie zamknięty.
Poniższy obraz pokazuje, jak wyglądają dzienniki skryptu, gdy skrypt nie zawiera kodu obsługującego sygnał przerwania.
Aby dowiedzieć się, jak modyfikować skrypty, aby odpowiednio reagowały na te sygnały, zapoznaj się z tematem Obsługa sygnałów systemowych w skryptach .
Nieplanowane zakończenia
W rzadkich przypadkach, na przykład gdy skrypt zużywa pamięć szybciej, niż system skryptowy jest w stanie monitorować zużycie, system może zakończyć działanie skryptu przed wykryciem przekroczenia limitu. Kiedy tak się dzieje, Scripting rejestruje niekompletny raport wykorzystania, pokazujący tylko dane zebrane przed zakończeniem działania.
Obsługa sygnałów systemowych w skryptach
Obsługa sygnałów pozwala na czyste zamknięcie skryptu, gdy zostanie on anulowany lub zatrzymany przez system. Dzięki przechwytywaniu i reagowaniu na sygnały systemowe skrypt może zwalniać zasoby, oszczędzać pracę i kończyć działanie w sposób prawidłowy (na przykład, gdy zostanie wyświetlony status „zakończony”), zamiast zostać automatycznie zakończonym.
Gdy skrypt zostanie zatrzymany, ponieważ użytkownik go anuluje lub przekroczy limity platformy, funkcja Scripting wysyła sygnały przerwania, zakończenia i kasacji.Aby dowiedzieć się więcej na temat sposobu wyzwalania sygnałów przerwania, zakończenia i zabicia, zapoznaj się z wcześniejszymi sekcjami.
Sygnały skryptowe i jak sobie z nimi radzić
W tej sekcji znajdują się bloki kodu i kompletny przykład, których można użyć do obsługi tych sygnałów.
Możesz zachować małe procedury obsługi sygnału i obsłużyć czyszczenie w jednym miejscu, używając bloku try/finally , który zawsze jest uruchamiany przy wyłączaniu. Dzięki temu skrypty są przewidywalne i łatwe w utrzymaniu.
Ogólna struktura obsługi sygnałów w skrypcie jest taka sama, niezależnie od tego, jaki sygnał jest odbierany:
- Początek pliku: importuj moduły i definiuj obsługę
- Wczesna inicjalizacja: zarejestruj handler przed wykonaniem jakiejkolwiek pracy
- Wokół Twojej pracy: zawiń główny kod w blok
try/finally , aby czyszczenie zawsze działało
Użytkownik anuluje przebieg (SIGINT)
Dzieje się tak, gdy użytkownik kliknie Anuluj , aby anulować uruchomienie skryptu.
# --- Początek pliku --- import signal, sys # Mały moduł obsługi: żądanie natychmiastowego, łagodnego wyjścia def _graceful_exit(signum, frame): print("Otrzymano sygnał SIGINT: zażądano anulowania. Czyszczenie…") raise SystemExit(0) # --- Wczesna inicjalizacja --- signal.signal(signal.SIGINT, _graceful_exit) Wokół Twojej pracy (dalej w pliku):
spróbuj: # tutaj wykonujesz swoją długotrwałą pracę... na koniec: # centralne miejsce do zamykania plików, opróżniania dzienników itp. print("Ostateczne czyszczenie przed wyjściem") Poniższy obraz pokazuje, jak wyglądają logi skryptu po obsłużeniu sygnału przerwania (SIGINT).
Bezpośrednia obsługa KeyboardInterrupt
Workiva Scripting zgłasza również KeyboardInterrupt , gdy do wątku głównego zostanie dostarczony sygnał SIGINT. Możesz wychwycić ten wyjątek w bloku try i wywołać tę samą ścieżkę czyszczącą zdefiniowaną przez _graceful_exit() .
spróbuj: # twoja długotrwała praca tutaj... z wyjątkiem KeyboardInterrupt: print("Otrzymano KeyboardInterrupt: czyszczenie przed wyjściem...") _graceful_exit(None, None) na koniec: # centralne miejsce do zamykania plików, opróżniania logów itp. print("Ostateczne czyszczenie przed wyjściem") Poniższy obrazek pokazuje, jak wyglądają logi skryptów, gdy sygnał przerwania jest obsługiwany za pomocą przerwania klawiatury.
Sygnał zakończenia skryptu informujący o konieczności zatrzymania po upływie okresu karencji (SIGTERM)
Skrypty żądają od skryptu zatrzymania (np. po przekroczeniu limitów). Twój skrypt ma krótki okres karencji na wyjście.
# --- Początek pliku --- import signal def _graceful_term(signum, frame): print("Otrzymano sygnał SIGTERM: platforma zażądała zakończenia. Kończenie…") raise SystemExit(0) # --- Wczesna inicjalizacja --- signal.signal(signal.SIGTERM, _graceful_term) Poniższy obrazek pokazuje, jak wyglądają logi skryptu po obsłużeniu sygnału zakończenia (SIGTERM).
Skrypt wysyła sygnał natychmiastowego zatrzymania (SIGKILL)
Jeżeli skrypt nie zostanie zamknięty w okresie karencji, Scripting wyśle sygnał SIGKILL.Nie możesz złapać SIGKILLA. Wyjdź natychmiast po otrzymaniu sygnału SIGINT/SIGTERM, aby blok Finally mógł zostać uruchomiony przed zabiciem.
Zrzuty ekranu w poprzednich sekcjach pokazują, jak będą wyglądać logi po otrzymaniu sygnału zabójstwa.
Pełny przykład (gotowy do kopiowania i wklejania)
Ten szablon rejestruje minimalne procedury obsługi i centralizuje czyszczenie w na końcu . Wklej do skryptu Workiva i zastąp zaznaczony obszar swoją logiką.
Gdzie dodać kod: Zastąp przykładową pętlę pod # ===== TWÓJ KOD ZACZYNA SIĘ TUTAJ ===== rzeczywistymi zadaniami. Unikaj bardzo długich, nieprzerwanych wywołań, aby skrypt mógł trafić w blok Finally zanim platforma eskaluje do SIGKILL.
"""Szablon skryptu Workiva: minimalne procedury obsługi + czyszczenie w Finally - Małe procedury obsługi wywołują SystemExit(0) przy SIGINT/SIGTERM - Pojedynczy blok Finally jest uruchamiany w celu czyszczenia niezależnie od tego, jak skrypt się zatrzymuje - Utrzymuje mały i przewidywalny kod """ import signal import time # --- Procedury obsługi sygnału (zachowaj małe) --- def _graceful_exit(signum, frame): print("Otrzymano SIGINT: zażądano anulowania. Czyszczenie…") raise SystemExit(0) def _graceful_term(signum, frame): print("Otrzymano sygnał SIGTERM: platforma zażądała zakończenia. Kończenie…” raise SystemExit(0) # --- Zarejestruj handlery PRZED wykonaniem jakiejkolwiek ciężkiej pracy --- signal.signal(signal.SIGINT, _graceful_exit) signal.signal(signal.SIGTERM, _graceful_term) # --- Główne zadanie skryptu --- def main(): print("Rozpoczynam pracę…” # ===== TWÓJ KOD ZACZYNA SIĘ TUTAJ ===== # Przykład długotrwałej pętli. Zastąp rzeczywistą logiką. for i in range(1, 1_000_000): # Symulacja jednostki pracy (zastąpienie rzeczywistą logiką) print(f"Praca nad elementem {i}…”") time.sleep(1) # ===== TWÓJ KOD KOŃCZY SIĘ TUTAJ ===== if __name__ == "__main__": try: main() Finally: # Centralne czyszczenie, które zawsze działa (również po otrzymaniu sygnału SIGINT/SIGTERM) print("Ostateczne czyszczenie przed wyjściem")