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-exit-status-of-process-thats-piped-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?

[quote=rulezdc]tee powinno pomoc[/quote]
chodzi o status a nie stdout

[url]http://www.spinics.net/lists/dash/msg00327.html[/url]
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?


[url=https://www.youtube.com/watch?v=rNg2Dh6gPkw]Nemo sailing home...[/url]

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?[/quote]
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?


[url=https://www.youtube.com/watch?v=rNg2Dh6gPkw]Nemo sailing home...[/url]

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...


[url=https://www.youtube.com/watch?v=rNg2Dh6gPkw]Nemo sailing home...[/url]

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?

No i wyszło szydłusio z worusia: xD

https://github.com/systemd/systemd/issues/3696#issuecomment-233184200

Offline

 

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

  Jacekalex - Podobno człowiek...;)

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

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

[quote=morfik]No i wyszło szydłusio z worusia: xD

https://github.com/systemd/systemd/issues/3696#issuecomment-233184200[/quote]
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
Nas ludzie lubią po prostu, a nie klikając w przyciski ;-)

[ Generated in 0.012 seconds, 9 queries executed ]

Informacje debugowania

Time (s) Query
0.00009 SET CHARSET latin2
0.00004 SET NAMES latin2
0.00182 SELECT u.*, g.*, o.logged FROM punbb_users AS u INNER JOIN punbb_groups AS g ON u.group_id=g.g_id LEFT JOIN punbb_online AS o ON o.ident='3.145.115.139' WHERE u.id=1
0.00090 REPLACE INTO punbb_online (user_id, ident, logged) VALUES(1, '3.145.115.139', 1733339176)
0.00078 SELECT * FROM punbb_online WHERE logged<1733338876
0.00046 SELECT t.subject, t.closed, t.num_replies, t.sticky, f.id AS forum_id, f.forum_name, f.moderators, fp.post_replies, 0 FROM punbb_topics AS t INNER JOIN punbb_forums AS f ON f.id=t.forum_id LEFT JOIN punbb_forum_perms AS fp ON (fp.forum_id=f.id AND fp.group_id=3) WHERE (fp.read_forum IS NULL OR fp.read_forum=1) AND t.id=28775 AND t.moved_to IS NULL
0.00042 SELECT search_for, replace_with FROM punbb_censoring
0.00287 SELECT u.email, u.title, u.url, u.location, u.use_avatar, u.signature, u.email_setting, u.num_posts, u.registered, u.admin_note, p.id, p.poster AS username, p.poster_id, p.poster_ip, p.poster_email, p.message, p.hide_smilies, p.posted, p.edited, p.edited_by, g.g_id, g.g_user_title, o.user_id AS is_online FROM punbb_posts AS p INNER JOIN punbb_users AS u ON u.id=p.poster_id INNER JOIN punbb_groups AS g ON g.g_id=u.group_id LEFT JOIN punbb_online AS o ON (o.user_id=u.id AND o.user_id!=1 AND o.idle=0) WHERE p.topic_id=28775 ORDER BY p.id LIMIT 0,25
0.00133 UPDATE punbb_topics SET num_views=num_views+1 WHERE id=28775
Total query time: 0.00871 s