Portál AbcLinuxu, 6. května 2025 16:32

Dotaz: azcopy prerusi 'while' cyklus

31.1.2020 16:28 GeorgeWH | skóre: 42
azcopy prerusi 'while' cyklus
Přečteno: 395×
Odpovědět | Admin
Zdravim,

mam jednoduchy shell skript, ktory vo while cykle prechadza obsah suboru po riadkoch (kazdy riadok predstavuje subor ulozeny na ms azure storage) a zistuje, ci dany subor existuje aj lokalne na disku. Ak subor neexistuje, tak ho vymaze aj z azure storage (taka primitivna obdoba rsync).

Problem je, ze cyklus sa stale ukonci, ked sa vymaze prvy subor z azure storage (exit status prikazu je 0). Ak samotny prikaz nevykonam, resp. ho nahradim vypisanim samotneho prikazu (ktory by sa spustil) pomocou echo, tak to funguje.

Cast skriptu, ktora nefunguje:
# delete remote files (if enabled)
if [ "x$delete_remote" = "x1" ]; then

  while read line; do

    file="$(echo $line | awk -F';' '{ print $2 }')"

    if [ ! -f "$file" ]; then
      azcopy remove "$url/$file?$sas" >/dev/null            <=== toto ukonci cyklus pri prvej zhode
      echo "azcopy remove \"$url/$file?$sas\" >/dev/null"   <=== ak to nahradim tymto, tak je to ok
      test $? -ne 0 && error=1
    fi
  done < $remote_files_list
fi
Obsah/format suboru $remote_files_list (prve je nazov, druhe je velkost):
;aaa/a1;0;
;aaa/a2;0;
;aaa/a3;0;
;bbb/b1;0;
;bbb/b2;0;
;bbb/b3;0;
Lokalne subory:
aaa/a1
aaa/a2
aaa/a3
takze by v azure malo postupne po jednotlivych suboroch vymazat cely adresar bbb.

Ked spustim shell v debug mode:
+ [ x1 = x1 ]
+ read line
+ echo ;aaa/a1;0;
+ awk -F; { print $2 }
+ file=aaa/a1
+ [ ! -f aaa/a1 ]
+ read line
+ echo ;aaa/a2;0;
+ awk -F; { print $2 }
+ file=aaa/a2
+ [ ! -f aaa/a2 ]
+ read line
+ echo ;aaa/a3;0;
+ awk -F; { print $2 }
+ file=aaa/a3
+ [ ! -f aaa/a3 ]
+ read line
+ echo ;bbb/b1;0;
+ awk -F; { print $2 }
+ file=bbb/b1
+ [ ! -f bbb/b1 ]
+ azcopy remove https://azure.storage.url/path/to/bbb/b1
+ test 0 -ne 0
+ read line
A cyklus sa ukonci (skript potom pokracuje dalej).

Netusite, cim by to mohlo byt?

Vdaka.

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

31.1.2020 17:00 NN
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
Odpovědět | | Sbalit | Link | Blokovat | Admin
Aby skript azcopy neovlivnil aktualni skript mohlo by stacit obalit prikaz do subshellu:
$(azcopy remove "$url/$file?$sas" >/dev/null)
test $? -ne 0 && error=1
Tipuju ze to zhavaruje a vezme sebou celou smycku.
31.1.2020 17:19 GeorgeWH | skóre: 42
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
Rovnaky vysledok. Skusal som exec azcopy remove ..., /bin/sh -c "/usr/bin/azcopy remove ...", eval $(echo "azcopy remove ..."), nic, stale sa cyklus ukonci po prvom odstraneni suboru, a azcopy skonci bez chyby (je to vidno aj v tom debugu).

Co ma napada je, ze azcopy nejakym sposobom "vymaze" data predane while cyklu. Je to mozne?

Skusim este stace.
31.1.2020 18:07 Peter Golis | skóre: 64 | blog: Bežné záležitosti | Bratislava
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
Odporučil by som nahlásiť tento bug na podporu MS Azure, tam patrí azcopy a jeho panické obhospodarovanie výnimiek.
Řešení 1× (Michal Kubeček)
Jendа avatar 31.1.2020 20:49 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
azcopy ... < /dev/null
31.1.2020 20:27 debian+
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
Nestaci iba:?
(azcopy remove "$url/$file?$sas" >/dev/null)
Řešení 1× (GeorgeWH (tazatel))
31.1.2020 19:57 GeorgeWH | skóre: 42
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pouzil som for miesto while a uz to funguje.
31.1.2020 20:21 NN
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
WTF?
31.1.2020 20:37 GeorgeWH | skóre: 42
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
Miesto
while read line; do
  ...
done < $remote_files_list
som pouzil
for line in $(cat $remote_files_list); do
  ...
done
a toto funguje.
Jendа avatar 31.1.2020 20:48 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
No sežere to zbytek vstupu z toho přesměrování a tím to skončí. Si zkus
cat /proc/cpuinfo | while read l; do echo $l; cat - > /dev/null; done
Tohle je obecně věc co nevím jak by se v Bashi měla řešit -- for cyklus nejde dělat když má člověk v těch věcech mezery (a současně chce původní IFS), u while je příjemné, že čte po řádcích. Ale zase to má tenhle problém.
3.2.2020 14:57 kolega
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
jo tohle je pak otravny resit pres \0 a xargs ...
4.2.2020 10:02 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: azcopy prerusi 'while' cyklus
Tohle je obecně věc co nevím jak by se v Bashi měla řešit

A o minutu později jsi sám řešení navrhl. :-)

Mimochodem, konstrukce

  cmd | while read v; do ... ; done

má ještě jeden háček: while cyklus se při ní provádí v subshellu, takže proměnné nastavené v těle cyklu se nedostanou "ven" (nelze takto předávat hodnoty zbytku skriptu). Naštěstí to bash umožňuje obejít pomocí

  while read v; do ... ; done < <( cmd )

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.