Według strony podręcznika xargs zakończy pracę, jeśli jeden z wierszy wykonawczych zostanie zamknięty z błędem 255:
Jeśli jakiekolwiek wywołanie polecenia zakończy się ze statusem 255, xargs zatrzyma się natychmiast bez odczytu dalszych danych wejściowych. Komunikat o błędzie jest wysyłany na stderr, gdy tak się dzieje.
Jak mogę uzyskać xargs, aby tego nie robił?
Mam około 1500 zadań wsadowych linii, które chcę uruchomić, 50 linii na raz. Odkryłem, że zawsze umiera na pewnej linii i nie kończy pracy. Niedobrze!
Jeszcze lepszym pytaniem, które opisuje to, co próbuję zrobić, jest:
Jak mogę uruchomić skrypt wsadowy o długości 1500 wierszy, po 50 wierszy jednocześnie, aby nie wychodził z zadania w środku i aby dane wyjściowe były przechwytywane do jakiegoś pliku dziennika?
sh -c
dla mnie wors!Możesz napisać swoje wywołanie xargs, aby zamaskować kody powrotne linii poleceń. W przypadku czegoś takiego,
xargs
nigdy nie zobaczy kodów wyjścia zwracanych przez komendę :źródło
Właśnie znalazłem zabawną odpowiedź na to pytanie, chociaż jego przydatność będzie zależeć od polecenia, które próbujesz uruchomić.
Jeśli używasz xargs w zasadzie do skompletowania listy poleceń, możesz uzyskać takie zachowanie, mówiąc xargs, aby echo polecenia, a następnie potokowanie do bash.
Na przykład, jeśli próbujesz usunąć listę rzeczy, które mogą istnieć lub nie:
Działa to, ponieważ po pierwsze, xargs zawsze wywołuje echo, więc nie zobaczy żadnych błędów. Następnie, ponieważ domyślne zachowanie bash kontynuuje wykonywanie po nieudanej instrukcji.
Aby być bardziej szczegółowym w moim przypadku, użyłem tego, aby usunąć kilka starych wersji aplikacji z AWS ElasticBeanstalk w następujący sposób:
źródło
Następujące prace budowlane dla mnie:
Nawet jeśli aktualizacja jakiegoś elementu zakończyła się niepowodzeniem, proces był kontynuowany
źródło
Jeśli korzystasz
xargs
zfind
, użyj-exec
opcjifind
zamiast:źródło
xargs
można uruchamiać polecenia równolegle. Fajne. Jeśli chcesz tylko zminimalizować liczbę wywołań poleceń,-exec
ma+
parametr.