Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
Status każdego ostatniego polecenia można sprawdzić podglądając to co siedzi w zmiennej $? . Co jednak w przypadku, gdy ma się ciąg poleceń, z których wyjście jednego jest podawane na wejście następnego? Jak w takim przypadku się odczyta $? , to status, który zostanie zwrócony dotyczy tylko ostatniego polecenia, a nie np. trzeciego, czy piątego albo ich obu naraz.
Znalazłem niby coś takiego: http://unix.stackexchange.com/questions/14270/get-e … ed-to-another ale tutaj jest tylko sposób na bash i zsh. A co w przypadku zwykłego dash, który takimi ficzerami nie dysponuje? Da się to w ogóle jakoś prosto zrobić, czy trzeba jechać na bash?
Poniżej jest przykład rozwiązania w bash:
for set in $sets do set -o pipefail cat /etc/peerblock/$set.gz | gunzip | cut -d: -f2 | grep -E "^[-0-9.]+$" | gawk -v my_set=$set '{print "add " my_set " " $1}' | $ips --restore -exist; if [ "$?" -ne "0" ]; then exit 1 fi done
Da radę jakoś podobnie to zrobić w dash/sh?
Offline
tee powinno pomoc
Offline
rulezdc napisał(-a):
tee powinno pomoc
chodzi o status a nie stdout
http://www.spinics.net/lists/dash/msg00327.html
Nie wiem co dokładnie robi Twój skrypt, ale dlaczego nie chcesz użyć bash'a ze zmienna pipestatus?
Chcesz aby rozwiązanie było zgodne ze standardem POSIX?
Offline
Chcesz aby rozwiązanie było zgodne ze standardem POSIX?
W sumie to mi generalnie to wszystko jedno ale bash nie zawsze jest wszędzie dostępny i dlatego szukam jakiegoś ujednoliconego rozwiązania.
A co do linku, to chyba jednak zostanę na bashu. xD
Offline
W sumie ma to sens. Taki skrypt można wtedy odpalić nawet na busybox.
Ciekawe zagadnienie ;)
Co ma robić ten skrypt?
Offline
No to akurat przykładowy skrypt, tj. cześć mojego firewalla, który zawiódł. A, że zawiódł raz, to może zawieść ponownie, a nie zamierzam do tego dopuścić. xD
Generalnie to jest coś takiego. Mam sobie usługę:
$ cat /etc/systemd/system/morfinetwork.service [Unit] Description=morfinetwork Documentation=man:iptables man:ipset man:tc man:sysctl DefaultDependencies=no Wants=systemd-modules-load.service After=systemd-modules-load.service Before=network-pre.target shutdown.target qbittorrent-nox.service Conflicts=shutdown.target [Service] Type=oneshot RemainAfterExit=yes ExecStart=/bin/sh -c "/etc/morfinetwork/ipset.sh" ExecStart=/bin/sh -c "/etc/morfinetwork/iptables_raw.sh" ExecStart=/bin/sh -c "/etc/morfinetwork/iptables_mangle.sh" ExecStart=/bin/sh -c "/etc/morfinetwork/iptables_nat.sh" ExecStart=/bin/sh -c "/etc/morfinetwork/iptables_filter.sh" ExecStart=/bin/sh -c "/etc/morfinetwork/ip6tables_raw.sh" ExecStart=/bin/sh -c "/etc/morfinetwork/ip6tables_mangle.sh" ExecStart=/bin/sh -c "/etc/morfinetwork/ip6tables_nat.sh" ExecStart=/bin/sh -c "/etc/morfinetwork/ip6tables_filter.sh" ExecStart=/bin/sh -c "/etc/morfinetwork/tc.sh" ExecStop=/bin/sh -c "/etc/morfinetwork/base.sh" [Install] WantedBy=multi-user.target
W manualu jest napisane, że jak wystąpi błąd w jednym ExecStart to polecenia w reszcie ExecStart nie zostaną wykonane a usługa przejdzie z automatu w FAILED. No tylko w tym przypadku, wystąpił błąd w pierwszym ExecStart, co uwaliło aktywowanie reszty skryptów, czyli tu jest OK, ale usługa nie przeszła w stan FAILED i tu już nie jest OK. xD Poniżej przykład:
# systemctl status morfinetwork.service ● morfinetwork.service - morfinetwork Loaded: loaded (/etc/systemd/system/morfinetwork.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2016-07-08 12:26:57 CEST; 2h 9min ago Docs: man:iptables man:ipset man:tc man:sysctl Main PID: 2045 (code=exited, status=0/SUCCESS) CGroup: /system.slice/morfinetwork.service Jul 08 12:26:47 morfikownia systemd[1]: Starting morfinetwork... Jul 08 12:26:54 morfikownia sh[2045]: gzip: stdin: not in gzip format Jul 08 12:26:57 morfikownia systemd[1]: Started morfinetwork.
W efekcie system będzie działał bez zapory i będzie traktował to jak rzecz normalną. xD
Nie wiem czemu tak się stało. xD
Dla przykładu, tak wygląda poprawnie odpalona usługa:
# systemctl status morfinetwork.service ● morfinetwork.service - morfinetwork Loaded: loaded (/etc/systemd/system/morfinetwork.service; enabled; vendor preset: enabled) Active: active (exited) since Fri 2016-07-08 14:37:11 CEST; 1s ago Docs: man:iptables man:ipset man:tc man:sysctl Process: 53365 ExecStop=/bin/sh -c /etc/morfinetwork/base.sh (code=exited, status=0/SUCCESS) Process: 53870 ExecStart=/bin/sh -c /etc/morfinetwork/tc.sh (code=exited, status=0/SUCCESS) Process: 53802 ExecStart=/bin/sh -c /etc/morfinetwork/ip6tables_filter.sh (code=exited, status=0/SUCCESS) Process: 53799 ExecStart=/bin/sh -c /etc/morfinetwork/ip6tables_nat.sh (code=exited, status=0/SUCCESS) Process: 53752 ExecStart=/bin/sh -c /etc/morfinetwork/ip6tables_mangle.sh (code=exited, status=0/SUCCESS) Process: 53748 ExecStart=/bin/sh -c /etc/morfinetwork/ip6tables_raw.sh (code=exited, status=0/SUCCESS) Process: 53670 ExecStart=/bin/sh -c /etc/morfinetwork/iptables_filter.sh (code=exited, status=0/SUCCESS) Process: 53657 ExecStart=/bin/sh -c /etc/morfinetwork/iptables_nat.sh (code=exited, status=0/SUCCESS) Process: 53595 ExecStart=/bin/sh -c /etc/morfinetwork/iptables_mangle.sh (code=exited, status=0/SUCCESS) Process: 53552 ExecStart=/bin/sh -c /etc/morfinetwork/iptables_raw.sh (code=exited, status=0/SUCCESS) Process: 53492 ExecStart=/bin/sh -c /etc/morfinetwork/ipset.sh (code=exited, status=0/SUCCESS) Main PID: 53870 (code=exited, status=0/SUCCESS) Jul 08 14:37:06 morfikownia systemd[1]: Stopped morfinetwork. Jul 08 14:37:06 morfikownia systemd[1]: Starting morfinetwork...
Zaraz będę pisał do devów systemd w tej sprawie i zobaczymy co oni powiedzą na takie dziwy. xD
Ostatnio edytowany przez morfik (2016-07-10 17:13:12)
Offline
Ło Panie, wyższa szkoła jazdy...
Offline
No i wyszło szydłusio z worusia: xD
https://github.com/systemd/systemd/issues/3696#issuecomment-233184200
Offline
morfik napisał(-a):
No i wyszło szydłusio z worusia: xD
https://github.com/systemd/systemd/issues/3696#issuecomment-233184200
Ja w ogóle nie czaję, po kiego czorta chcesz w jednej usłudze tyle skryptów odpalać.
Nie lepiej całość wywalić jednym skryptem, i gdzieś go zapiąć w usługach startowych?
Z takiego skrypta możesz odpalać 50 innych, już poza zasięgiem systemd.
Online
Skoro jest opcja odpalania wielu poleceń w systemd, to czemu z niej nie skorzystać? A, że ona nie działa jak należy... xD Poza tym, ten mój FW to tylko jeden przykład ale w debianie są usługi które wykorzystują szereg tych exec* i one również są podatne na ten błąd. Z tego co tam widzę, to oni się z nim nie potrafili uporać przez rok i chyba raczej nie prędko to poprawią. Pewnie będę musiał ten mój FW przepisać i dodać w nim trochę IFów i może zamknę to w jednym pliku, choć mi ta usługa bardzo przypadła do gustu. xD
Offline
Strony: 1