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-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:
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
[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?
Offline
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
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
[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.
Offline
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
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 |