Fórum Ubuntu CZ/SK
Ubuntu pro osobní počítače => Software => Příkazový řádek a programování pro GNU/Linux => Téma založeno: timmynovak 13 Listopadu 2011, 19:59:14
-
Ahoj, mám následující skript spouštěný cca 1 za 5 vteřin a testující mi existenci procesu (je to navíc démon):
if [ `pgrep j1.out` ]; then
exit
else
/home/user1/j1.out
fi
dnes se mi ale stalo, že skript začal spouštět další a další j1.out, což o to, další bych chápal, ale proč, když běžel první a nedošlo k jeho pádu spustil nový? V lozích nic:( Díky za nakopnutí.
-
Takže nakopnutí... OK. ;)
~ $ pgrep sleep
14541
~ $ if [ `pgrep sleep` ]; then echo sleep běží; else echo neběží; fi
sleep běží
~ $ sleep 1m &
[1] 14562
~ $ if [ `pgrep sleep` ]; then echo sleep běží; else echo neběží; fi
bash: [: 14562: unary operator expected
neběží
-
Ještě bych doplnil:
rna@asrock-rna:~> pgrep http
3970
3975
3976
3978
3979
3980
9152
9153
9154
-
když je tam vícekrát, tak chápu, že se to pak spouští dokola... ale on by měl běžet jen jednou, nic dalšího, vyjma tohoto skriptu ho spustit nemůže, ani není suspendován, nic takového:(
-
Tohle by mělo být lepší:
if ! pgrep j1\.out; then /home/user1/j1.out; fi
-
Tohle by mělo být lepší:
if ! pgrep j1\.out; then /home/user1/j1.out; fi
Na co to lomítko? ;)
~ $ strace -e trace=execve pgrep j1\.out
execve("/usr/bin/pgrep", ["pgrep", "j1.out"], [/* 37 vars */]) = 0
~ $ strace -e trace=execve pgrep j1.out
execve("/usr/bin/pgrep", ["pgrep", "j1.out"], [/* 37 vars */]) = 0
-
Osobně bych doporučoval:
1. Nepoužívat if [ `prikaz` ]
ale if prikaz
2. Používat plnou cestu
pgrep -f '/home/user1/j1\.out'
# nebo
pidof /home/user1/j1.out
-
Tohle by mělo být lepší:
if ! pgrep j1\.out; then /home/user1/j1.out; fi
Na co to lomítko? ;)
Máš pravdu, mám tam chybu, mělo to být:
if ! pgrep 'j1\.out'; then /home/user1/j1.out; fi
Tečka značí libovolný znak přeci. Ale escapovat se dá pouze po uzavření do uvozovek.
Asi jsi to nepsal, že nevíš, ale zas to třeba neví někdo jiný :)
Mi to nedá ještě dovysvětlit.. Tak jak jsem to napsal lomítkem escapuju tečku pro interpret Bashe, který to projede, a pgrepu dodá stejně pouze řetězec j1.out, zatímco po uzavření do uvozovek, dostane pgrep regulární výraz v plném znění 'j1\.out', aby vyhledal řetězec s tečkou a né libovolným znakem na jejím místě.
-
díky všem, chápu různá řešení, ale nerozumím tomu, proč když proces prokazatelně běžel, tak můj skript zdetekoval, že neběží:(
-
Ahoj, mám následující skript spouštěný cca 1 za 5 vteřin a testující mi existenci procesu (je to navíc démon):
if [ `pgrep j1.out` ]; then
exit
else
/home/user1/j1.out
fi
dnes se mi ale stalo, že skript začal spouštět další a další j1.out, což o to, další bych chápal, ale proč, když běžel první a nedošlo k jeho pádu spustil nový? V lozích nic:( Díky za nakopnutí.
protoze ten test je blbost ... blbe napsanej ...:D ..
test `pgrep $foo`
je jednim slovem kravina ;)
dej tam:
pgrep j1.out || /home/user1/j1.out;
-
OK, chápu, že když to nezafungovalo, je to rozbitý:) to vím taky. díky i za radu, jak z toho ven. učím se věci ale i proto, abych jim rozuměl, čili, můžeš mi, prosím, vysvětlit, zda:
pgrep `cokoli`
při výskytu cokoli pouze 1 x vrátit najednou něco jiného, než jindy? A pokud ano, proč? žil jsem v domění, že vypíše proces (PID). Děkuji.
-
michas jablka s hruskama .. precti si prosim v manualu a vyzkousej jak funguje test ,, nijak to nesouvisi s pgrepem a tim co vypise
-
test ( EXPRESSION )
EXPRESSION is true
předpokládám, že jakékoli kladné číslo je se vyhodnotí jako TRUE. Nebo se pletu? A PID bylo k dispozici, tj. kladné číslo ve výrazu. A nebo to (což je velmi pravděpodobné) nechápu.
-
# [ `false` ] || echo takhle to nefunguje
takhle to nefunguje
# [ false ] && echo takhle to funguje
takhle to funguje
-
děkuji
-
Nevysvětluje to ale, proč mu to někdy "fungovalo", a někdy ne.
Jinak jsem se koukal, že je to docela oblíbený způsob testování, např. :)
http://www.google.com/codesearch#naIFDuIU500/trunk/devtools/ydoc/po-tools/po-insert&ct=rc&cd=8&q=if\%20\[\%20\%60[^=]*\%60\%20\]%20lang:^shell$
viz řádek if [ `grep fuzzy $i` ] ; then
-
Řekl bych, že důvodem bylo to, co naznačil RNA - měl už tehdy omylem puštěno instancí více.
-
ach jo .. to co odkazujes je **spatne .. to ze to je na internetu neznamena, ze to neni blbost
proc kluk tvrdi ze to predtim fungovalo a potom ne neresim .. je to zcela irelevantni
-
ach jo .. to co odkazujes je **spatne .. to ze to je na internetu neznamena, ze to neni blbost
proc kluk tvrdi ze to predtim fungovalo a potom ne neresim .. je to zcela irelevantni
Se hned nerozčiluj, já nikde netvrdím, že je to správně :)
A není to "někde z internetu", vzal jsem to z yast2-devtools ze stránek OpenSuSE Factory for noarch
http://rpmfind.net//linux/RPM/opensuse/factory/noarch/yast2-devtools-2.21.6-1.1.noarch.html
Jinak souhlas s GdH.
-
Řekl bych, že důvodem bylo to, co naznačil RNA - měl už tehdy omylem puštěno instancí více.
Ne, neměl:)
-
proc kluk tvrdi ze to predtim fungovalo a potom ne neresim .. je to zcela irelevantni
pro mne zcela relevantni, protoze se vzdy vse snazim pochopit. jestlize cca rok mi to funguje na dvou mistech k plne spokojenosti, tak se snazim pochopit, co zpusobilo to, ze to najednou bylo blbe. vim, ze vice instanci daneho procesu nebezelo. Najednou z niceho nic se test vyhodnotil spatne. Ja nepopiram a v tento moment ani neresim to, ze ten test je spatne jako takovy, jen bych chtel vedet, proc najednou selhal. Když budu místo sčítání používat násobení, tak sice dostávám špatný výsledek, ale vždy stejný. tady se to tak nestalo:(
-
Další varianta je, že ti běžel proces, který vyhověl vzoru j1.out, čili např. můj12outsider.
Jasněji bude, když spustíš ten skript s přepínačem -x (debug)#! /bin/bash -x
a jeho výstup zaznamenáš do logu.
-
dík za tip na zaznamenávání, myslíms i, že se to už nestane (vzhledem k tomu, jak dlouho se to nestalo předtím), shoda masky je jistě vyloučitelná, já ten název jen zkrátil, ve skutečnosti je to jddrz2011tm.out
-
me uz to stve .. nechapu na co se furt dokola ptas ... ja osobne neverim ze to bylo jak rikas - tim nemyslim ze bys nerikal pravdu, ale spis myslim ze v tom mas trocha bordel .. proste to nahrad ve skriptu za
if ! pgrep j1.out; then
/home/user1/j1.out;
fi
-
a víš co štve mne? tvoje neuvěřitelná nadutost a povyšování, nejsem jediný, kdo má ten názor. když neznáš odpověď, tak neodpovídej. a ne, nemám v tom bordel, vím, že prostě proces se stejným jménem se tam objevit znovu nemohl. OK, ten test je blbě a na to jsem neřekl ani ň. To ale nevysvětluje to, k čemu došlo. OK, chápu, odpověď nevíš nebo nechceš odpovědět - ale prosím už se konečně přestaň navážet do mne nebo do kohokoli jiného. Ano, mám tě osobně za nadutého a přechytralého hňupa. Ne nadarmo se o tobě říká, ten, jehož jménos enevyslovuje. máte ledasco společného. a klidně mi dej ban.
-
Pořád se zde opakuje to stejné dokola, jen ostřejším tónem, takže zamykám.
V případě nějakých nových skutečností prosím založit nové vlákno.