Portál AbcLinuxu, 14. května 2024 14:59


Dotaz: Oprava scriptu

11.3.2013 12:52 TT
Oprava scriptu
Přečteno: 557×
Odpovědět | Admin
Ahoj, proč mi podmínka pořád vyhodnocuje exit, i když stejný program není spuštěn? Je to kontrolováno přímo ze scriptu který se kontroluje. Díky
ps aux | grep -v "grep" | grep -q "/home/foo.sh"
if [ $? -eq 0 ]; then
   exit
else
   # echo "pokračuji.."
fi
Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

11.3.2013 13:00 potato
Rozbalit Rozbalit vše Re: Oprava scriptu
Odpovědět | | Sbalit | Link | Blokovat | Admin
Dotaz nedává moc smysl. exit se spustí, když je návratový kód roury nula. Ten je nula, pokud byl poslední příkaz v rouře úspěšný (pokud nenastavils v bashi pipefail). grep je úspěšný, pokud něco našel. Proč něco našel, nelze z dodaných informací říci, ale když odstraníš -q, tak zjistíš, co našel.

Celé grepování výstupu ps je navíc zvrácené, ps má volby typu -C, které umožňují filtrovat podle příkazu a -o, které umožňuje vypisovat o příkazu jen to, co chceš.
11.3.2013 13:45 TT
Rozbalit Rozbalit vše Re: Oprava scriptu
Tak zkusím lepe položit dotaz, potřebuji zjistit, jestli script již nebeží, jelikož je povolena poze jediná instance programu, a jelikož spouštím to zjištění přímo z toho scriptu který to má zjistit, tudíž je to komplikovanější a podmínka by asi měla být něco jako
if [$res -lt 2 ]
ale nevím jak na to..
11.3.2013 13:47 TT
Rozbalit Rozbalit vše Re: Oprava scriptu
Pokud odstraním -q tak to najde jednou spuštěný script, asi ten ze kterého se ten test, což dáva smysl, ale jak zjsitit jestli je spuětěn jednou nebo vícekrát?
11.3.2013 13:56 ubka7617
Rozbalit Rozbalit vše Re: Oprava scriptu

if [ $(pgrep -c foo.sh)  -eq 0  ]; then
echo nebezi
else
echo bezi

fi

11.3.2013 14:17 TT
Rozbalit Rozbalit vše Re: Oprava scriptu
Výsledek je vždy 0 i když běží program vícekrát..
11.3.2013 14:31 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Oprava scriptu

Aj takto je vysledok 0 ? :

#! /bin/bash
if [[ "$(pgrep -c "${0##*/}")" -eq 0 ]]
then
    echo nebezi
else
    echo bezi
fi

Ja len, ci si nezabudol zamenit foo.sh za nazov tvojho skriptu. Nic v zlom, sa mi aj horsie uz stalo. :)

11.3.2013 14:56 TT
Rozbalit Rozbalit vše Re: Oprava scriptu

Ja len, ci si nezabudol zamenit foo.sh za nazov tvojho skriptu. Nic v zlom, sa mi aj horsie uz stalo. :)

Ano, stává se to i mě ;-) ale v tomto případě se to opravdu soubor tak jmenuje. No pokud v tom tvém kodu změním -eq 0 za -eq 1 tak to funguje jak má.. Díky moc
11.3.2013 16:55 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Oprava scriptu

Akurat, ze to v tom pripade nefunguje. Logicky je to nespravne, bo ak je pocet beziacich procesov s tymto nazvom rovny 1, tak dalsi uz nespustim a ak je rovny 0, tak ho spustim a toto je presne moj kod a tvoje zadanie.

Skus dat do svojho kodu nasledovne:

echo '==== kontrola ===='
echo "skript: $0"
echo "vypis procesov:"
ps xau | grep "${0##*/}"
echo '=== koniec ===''

a na zaciatok skriptu, hned za shebang daj

set -x

a daj sem vsetko, co to vypluje.

11.3.2013 17:10 TT
Rozbalit Rozbalit vše Re: Oprava scriptu
Tady to je..

root@debian:~# ./foo.sh
++ echo '==== kontrola ===='
==== kontrola ====
++ echo 'skript: ./foo.sh'
skript: ./foo.sh
++ echo 'vypis procesov:'
vypis procesov:
++ grep foo.sh
++ ps xau
root     13932  0.0  0.0   6544   880 pts/2    S+   17:09   0:00 grep foo.sh
./foo.sh: řádek 7: neočekávaný konec souboru při hledání znaku odpovídajícímu „'“
./foo.sh: řádek 8: chyba syntaxe: nenadálý konec souboru
root@debian:~#
11.3.2013 19:45 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Oprava scriptu

Skor som mal na mysli, ze by si to pridal k tomu svojmu kodu, mozno by sa ukazalo, co sa skutocne deje. U mna to funguje spravne a este minimalne dalsi clovek z tohto vlakna to potvrdil. A najlepsie, tak s uz spustenym procesom a bez taktiez.

11.3.2013 20:33 TT
Rozbalit Rozbalit vše Re: Oprava scriptu
No mě to běží s tou jedničkou bez problémů, čili to tak nechám akorát bych potřeboval dát do té podmínky pevný název
if [[ "$(pgrep -c "${0##*/}")" -eq 0 ]]
zkoušel jsem to takto ale nejde to
if [[ "$(pgrep -c "foo.sh")" -eq 0 ]]
díky
11.3.2013 21:09 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Oprava scriptu

Ak pouzijes premennu, tak sa nemusis nikdy starat. Ak to das napevno, tak niekomu das kod, pomenuje si skript inak a uz to nepojde, ako ma. A prechadzat skript, ze kde to este je pouzite, ze mi to pada stale, neviem, su aj zaujimavejsie veci, co riesit. Inak napevno, ako si to ukazal, neviem.

p.s.: Ak ti to bezi s jednickou, tak niekde musi byt zrada, ale kod tu cely nie je. Takze to je na tebe.

12.3.2013 13:52 TT
Rozbalit Rozbalit vše Re: Oprava scriptu
To je sice pravda, ale problém je v tom, že ten soubor sourcnu do toho foo.sh a tím pádem už to nefunguje, jelikož se to provede v tom sourcovaném souboru, jelikož tam je automatické zjištění názvu, což už není foo.sh :-(
12.3.2013 14:51 Patrik Uhrak | skóre: 31 | blog: pato
Rozbalit Rozbalit vše Re: Oprava scriptu

To nie je ziaden problem, vid nasledujuce (dva skripty, jeden test1.bash a druhy test2.bash ):

#! /bin/bash
source test2.bash "$0"
echo "nazov skriptu z test1.bash: ${0##*/}"
#! /bin/bash
echo "nazov hlavneho skriptu zo sourcovaneho test2.bash: ${1##*/}"

Jednoducho je to iba o predavani parametrov.

12.3.2013 15:37 potato
Rozbalit Rozbalit vše Re: Oprava scriptu
A proč to filtruješ podle názvu procesu namísto pidu toho shellu, který je v $$?
11.3.2013 15:30 TT
Rozbalit Rozbalit vše Re: Oprava scriptu
ještě jedna věc,

když nahradím tohle
if [[ "$(pgrep -c "${0##*/}")" -eq 0 ]]
za tohle
if [[ "$(pgrep -c "foo.sh")" -eq 0 ]]
tak to přestane fungovat, proc? Díky
11.3.2013 14:44 ubka7617
Rozbalit Rozbalit vše Re: Oprava scriptu

vola sa to foo.sh ? som to skusal a v pohode funguje spravne

11.3.2013 14:57 TT
Rozbalit Rozbalit vše Re: Oprava scriptu
Ano volá se to foo.sh a u mě to nefunguje, což je divný že u tebe ano :-(

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.