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!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2016-07-10 10:29:32

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Jak zweryfikować status poleceń w pipe w dash/sh?

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:

Kod:

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

 

#2  2016-07-10 10:44:00

  rulezdc - Członek DUG

rulezdc
Członek DUG
Skąd: Tarnowskie Góry
Zarejestrowany: 2007-05-22

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

tee powinno pomoc

Offline

 

#3  2016-07-10 11:00:29

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

To jak miałoby wyglądać to przykładowe polecenie, które widać w pierwszym pocie? xD

Offline

 

#4  2016-07-10 11:08:33

  Zbooj - Dark Sith

Zbooj
Dark Sith
Skąd: Siedziba Wszelkiego Zła
Zarejestrowany: 2005-07-28

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

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

 

#5  2016-07-10 14:23:30

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

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

 

#6  2016-07-10 15:56:59

  Zbooj - Dark Sith

Zbooj
Dark Sith
Skąd: Siedziba Wszelkiego Zła
Zarejestrowany: 2005-07-28

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

W sumie ma to sens. Taki skrypt można wtedy odpalić nawet na busybox.
Ciekawe zagadnienie ;)
Co ma robić ten skrypt?

Offline

 

#7  2016-07-10 17:11:18

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

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ę:

Kod:

$ 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:

Kod:

# 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:

Kod:

# 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

 

#8  2016-07-10 17:51:22

  Zbooj - Dark Sith

Zbooj
Dark Sith
Skąd: Siedziba Wszelkiego Zła
Zarejestrowany: 2005-07-28

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

Ło Panie, wyższa szkoła jazdy...

Offline

 

#9  2016-07-18 21:22:07

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

Offline

 

#10  2016-07-18 23:08:18

  Jacekalex - Podobno człowiek...;)

Jacekalex
Podobno człowiek...;)
Skąd: /dev/random
Zarejestrowany: 2008-01-07

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

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.


W demokracji każdy naród ma taką władzę, na jaką zasługuje ;)
Si vis pacem  para bellum  ;)       |       Pozdrawiam :)

Offline

 

#11  2016-07-19 07:08:41

  morfik - Cenzor wirtualnego świata

morfik
Cenzor wirtualnego świata
Skąd: ze WSI
Zarejestrowany: 2011-09-15
Serwis

Re: Jak zweryfikować status poleceń w pipe w dash/sh?

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

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)