/ / Wyłącz lub zabroń błędów krytycznych podczas uruchamiania skryptu? - perl

Wyłączyć lub zabronić fatalnych błędów podczas uruchamiania skryptu? - perl

Mamy pewien skrypt (1), który wykonuje pętlę poprzez "różne działania, a następnie śpi przez 60 sekund, a następnie przechodzi przez to wszystko ponownie." Ten skrypt musi działać 24 godziny na dobę.

Dodajemy nowe funkcjonalności w czasie (1)w pętli lub po prostu w trakcie przypadkowych problemów, czasami zawodzą i niestety powodują awarię całego skryptu. Rozwiązanie owijało wszystkie takie funkcje w eval {}, ale moje pytanie brzmi ... Czy istnieje ogólnoświatowe ustalenie, że wszystkie błędy lub fatały NIE zatrzymują / nie zabijają całego skryptu, więc nie musimy owijać wszystkiego wokół eval {}?

Odpowiedzi:

3 dla odpowiedzi № 1

To, co próbujesz zrobić - zignoruj ​​wszelkie błędy, działaj za wszelką cenę - jest bardzo wątpliwą praktyką, może doprowadzić twój program do niezdefiniowanego stanu i sprawić, że rzeczywiste błędy będą jeszcze trudniejsze do znalezienia.

ty mógłby w teorii zastąpić CORE::GLOBAL::die podprogram, aby wychwycić wyjątki z twojego kodu Perla, ale prawdziwy die jest nadal dostępny jako CORE::die sub, a to nie zatrzymuje błędów z kodu XS lub samego perla (w przeciwieństwie do używania eval). Zauważ, że niektóre moduły używają die i warn do sterowania przepływem. Rozważ następujący kod:

sub foo {
my ($x, $y) = @_;
croak "X must be smaller than Y" unless $x < $y;
return $y - $x;
}

Teraz jeśli die staje się warn, wówczas funkcja ta może zacząć generować liczby ujemne, powodując wszelkiego rodzaju spustoszenie (na przykład, gdy jest używane dla wskaźników tablicowych).

Proszę, zostań z eval rozwiązanie, a nawet lepsze: migracja do Try::Tiny. Błędy krytyczne istnieją z jakiegoś powodu.


Jeśli wysoka niezawodność jest koniecznością, możesz chcieć przyjąć model podobny do Erlanga: Pula procesów roboczych. Jeśli pojawi się błąd, proces ten zostanie zabity i rozpocznie się proces wymiany.


3 dla odpowiedzi № 2

To nie ma sensu. W jaki sposób program wie, gdzie można wznowić? Musisz powiedzieć mu, gdzie i za pomocą tego eval.

Z pewnością lepiej byłoby napisać wrapper dla skryptu, który rejestruje awarie i restartuje skrypt.


2 dla odpowiedzi nr 3

Mimo innych odpowiedzi faktem jest, że niektóre błędy mogą nie być łatwe do odzyskania, a samo ich ignorowanie i chodzenie dalej może łatwo spowodować niepożądane zachowanie. Inną opcją jest usunięcie while loop, aby skrypt wykonał tylko jeden raz i wywoływał go z cron, który pozwala uruchamiać programy według harmonogramu. Na przykład możesz otworzyć powłokę i zadzwonić crontab -e aby edytować harmonogram i dodać tę linię:

* * * * * perl /path/to/script.pl

co uruchomi twój skrypt co minutę i wyśle ​​ci pocztę z danymi wyjściowymi, jeśli takie istnieją, włączając w to ostrzeżenia i błędy.