Portál AbcLinuxu, 10. května 2025 13:22

Dotaz: posielanie "signalov" medzi beziacimi bash scriptami

17.10.2011 15:28 eth4rendil | skóre: 13
posielanie "signalov" medzi beziacimi bash scriptami
Přečteno: 231×
Odpovědět | Admin
Dobrý deň,

chcel by som sa spýtať. Je možné medzi bežiacimi bash scriptami posielať premenné. Teda napr. script xy je spustený 10 krát s iným argumentom. Teda jeden script odošle druhému "signál" ktorým si druhý zmeni napr. premennú. Blbo sa mi to vysvetluje radšej príklad :) :

main.sh:
#!/bin/bash

ARGUMENTS=( arg1 arg2 arg3 arg4 arg5 )

        for ARGUMENT in ${ARGUMENTS[@]}
        do
                ./slave.sh $ARGUMENT &
                ./slave.sh $ARGUMENT &
        done
slave.sh:
#!/bin/bash

ARGUMENT=$1

while [ 1 ]
do
        echo $ARGUMENT 
        sleep 30
done
main.sh spustí 10 krát script slave.sh s rôznymi argumentami. Ciel je aby script napr. "slave.sh arg1" odoslal signál na zmenu premennej napr. "slave.sh arg2" a ten premennu zmenil... Jedine čo ma napladlo je, že by sa premenne ukladali do dočasneho suboru s nazvom hodnota argumentu a od tial by si to slave.sh v každom cykle čital. Ale toto riešenie sa mi nezda moc dobré. Napadá Vás niečo? ďakujem

Řešení dotazu:


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

Odpovědi

17.10.2011 15:58 NN
Rozbalit Rozbalit vše Re: posielanie "signalov" medzi beziacimi bash scriptami
Odpovědět | | Sbalit | Link | Blokovat | Admin
Promennou muzes exportovat tak, ze ji subshell zdedi:
export ARG=val
NN
17.10.2011 16:09 eth4rendil | skóre: 13
Rozbalit Rozbalit vše Re: posielanie "signalov" medzi beziacimi bash scriptami
dakujem. Ale slave.sh je subshell main.sh. Mne ide o odoslanie premennej medzi konkrétnymi slave.sh scriptami.
Řešení 1× (eth4rendil (tazatel))
17.10.2011 16:09 l4m4
Rozbalit Rozbalit vše Re: posielanie "signalov" medzi beziacimi bash scriptami
Odpovědět | | Sbalit | Link | Blokovat | Admin
=====[ master.sh ]=====
#!/bin/bash

coproc bash slave.sh
#echo $0: pid is ${COPROC_PID}
#echo $0: output is ${COPROC[0]}
#echo $0: input is ${COPROC[1]}
queue=/dev/fd/${COPROC[1]}

echo "A message" >$queue
echo "Another message" >$queue
sleep 5
echo "A delayed message" >$queue

=====[ slave.sh ]=====
#!/bin/bash
while read message; do
    echo "$0: Got a message: $message." 1>&2
done
echo "$0: Finished." 1>&2
17.10.2011 16:20 eth4rendil | skóre: 13
Rozbalit Rozbalit vše Re: posielanie "signalov" medzi beziacimi bash scriptami
uzasne, dakujem pekne
17.10.2011 16:37 eth4rendil | skóre: 13
Rozbalit Rozbalit vše Re: posielanie "signalov" medzi beziacimi bash scriptami
len škoda, že sa môže coproc spustiť iba 1x. Pri pokuse spustiť viac krát sa zobrazí: warning: execute_coproc: coproc [26841:COPROC] still exists

niekde som objavil takéto niečo:
#!/bin/bash

# Clone stdout to 3
exec 3>&1
# Run TRA filtering letter "a"
coproc TRA ( sed s/a/A/g >&3 )
# Run TRB filtering letter "b"
coproc TRB ( sed s/b/B/g >&3 )

while read ; do
        case $REPLY in
        /* )
                echo "$REPLY" >&${TRB[1]}
                ;;
        * )
                echo "$REPLY" >&${TRA[1]}
                ;;
        esac
done

# Close input (otherwise script will not end on EOF).
eval exec ${TRA[1]}\>\&-
eval exec ${TRB[1]}\>\&-
vyzerá to o niečo zložitejšie, ale snáď to bude fungovať :)
17.10.2011 16:44 dustin | skóre: 63 | blog: dustin
Rozbalit Rozbalit vše Re: posielanie "signalov" medzi beziacimi bash scriptami
Jen poznámka - je to feature bash 4, např. v oldstable debian lenny ještě není k dispozici. Stejně jako třeba asociativní pole - skript jsem po nasazení na produkční server s lenny musel přepsat do pythonu :)
17.10.2011 16:52 eth4rendil | skóre: 13
Rozbalit Rozbalit vše Re: posielanie "signalov" medzi beziacimi bash scriptami
to som mal stastie :)
GNU bash, version 4.1.5(1)-release
Fungovať to funguje ale toho warningu sa nezbavím :/
17.10.2011 17:30 l4m4
Rozbalit Rozbalit vše Re: posielanie "signalov" medzi beziacimi bash scriptami
coproc lze použít vícekrát i bez warningu, a to s jiným NAME; akorát tomu neumím vnutit podle dokumentace jiný NAME -- a nikdy jsem to nepotřeboval tak moc, abych musel zjistit jak to tedy udělat.

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.