Ubuntu Suomen keskustelualueet
Ubuntun käyttö => Ohjelmointi, palvelimet ja muu edistyneempi käyttö => Aiheen aloitti: moonstone - 15.08.07 - klo:13.57
-
Hei,
Tarvitsisin bash skriptin joka tarkistaa onko firefox käynnissä ja jos ei ole firefox käynnisttäisiin.
Käsittääkseni tuon voi tehdä helposti while ja if syntakseja käyttäen yhdistettynä vaikka pstree komentoon.
pstree komento tulostaa seuraavanlaisen rimpsun
pstree | grep firefox
|-firefox-bin--7*[{firefox-bin}]
kuinka saan tuon siistittyä niin, jotta sama komento tuottaisi vaan rivin
firefox-bin
Tällöin osaisin itse tehdä if lausekkeen joka lukisi kyseisen tulosteen ja suorittaisi lauseketta eteenpäin.
-
Humm, käyttäisin itse komentoa 'pgrep'.
Varsinaiseen kysymykseen vastaus lienee komento 'pstree | grep -o firefox-bin | head -n 1', mutta varsinaista hyötyä komennosta on vaikea havaita.
Jotakin tällaista:
# Suoritetaan hamaan tappiin asti
while (1)
{
[ $(pgrep firefox) ] || firefox &
# ootellaan vaikka minuutti
sleep 60
}
E: körh-öhm, siis komentohan firefoksin käynnistämiseen on pelkkä 'firefox' vrt. prosessin nimi 'firefox-bin'
-
testi.sh
#!/bin/bash
# Suoritetaan hamaan tappiin asti
while (1)
{
[ $(pgrep firefox) ] || firefox &
# ootellaan vaikka minuutti
sleep 60
}
aleksi@debian:~$ ./testi.sh
./while.sh: line 11: syntax error: unexpected end of file
????
-
Miksi siinä pitää käyttää komentoa pstree? Eikö normaali ps kelpaisi paremmin, sitä saa siistittyä helpommin?
ps -A | grep bash | tail -c 5
-
testi.sh
#!/bin/bash
# Suoritetaan hamaan tappiin asti
while (1)
{
[ $(pgrep firefox) ] || firefox &
# ootellaan vaikka minuutti
sleep 60
}
aleksi@debian:~$ ./testi.sh
./while.sh: line 11: syntax error: unexpected end of file
????
while-kielioppi hukassa, korjataanpa. Nyt pitäisi toimia:
#!/bin/bash
while (true)
do
while [ ! $(pgrep firefox) ]
do
firefox &
# Jos halutaan taukoa, tähän kohtaan 'sleep' -komentoa, minuutin tauko on esim.
# sleep 60
done
done
-
Miksi siinä pitää käyttää komentoa pstree? Eikö normaali ps kelpaisi paremmin, sitä saa siistittyä helpommin?
ps -A | grep bash | tail -c 5
ps -A -o comm | grep -m 1 bash #Pelkät komennot @ ps -o comm; ylimääräiset entryt poistuu @ grep -m 1
ps -A | grep -m 1 -o bash #Mätsäävät kirjaimet näytetään @ grep -o
ps -A | grep -c bash # ja näin lasketaan noiden prosessien määrä @ grep -c
ps -A | grep -c -m 1 bash # lisätään vielä -m 1 niin saadaan tulokseksi 1 jos prosessi löytyy, muuten 0
Tekemisen vapaus ;)
E: +2
-
Kiitos opastuksesta. Toimii niinkuin pitääkin !!
-
#!/bin/bash
while (true)
do
while [ ! $(pgrep firefox) ]
do
firefox &
# Jos halutaan taukoa, tähän kohtaan 'sleep' -komentoa, minuutin tauko on esim.
# sleep 60
done
done
Sleep-komentoa on syytä käyttää jotta prosessoria ei kuormiteta turhaan busy-loopilla. Lisäksi se pitää sijoittaa ulompaan silmukkaan tai muuten siitä ei ole mitään iloa.
#!/bin/bash
while (true); do
while [ ! $(pgrep firefox) ]; do
firefox &
done
sleep 5
done
-
Sleep-komentoa on syytä käyttää jotta prosessoria ei kuormiteta turhaan busy-loopilla.
Sitäpä halusinkin tuolla kommenttikohdallani sanoa, ilmeisesti en kuitenkaan riittävän selkeästi.
Lisäksi se pitää sijoittaa ulompaan silmukkaan tai muuten siitä ei ole mitään iloa.
Sleep-komennon paikalla ei näiden looppien välillä liene mitään käytännön merkitystä; se nukuttaa ohjelman kuitenkin halutuksi hetkiseksi. Minulla se vain vaikutti toimivan keskiloopin sisällä paremmin kuin ulomman.
Eli jäi sangen sisällöttömäksi viestisi, mutta toki haluan 'skriptigurun' mielipiteitäsi lueskella :)
-
Sleep-komentoa on syytä käyttää jotta prosessoria ei kuormiteta turhaan busy-loopilla.
Sitäpä halusinkin tuolla kommenttikohdallani sanoa, ilmeisesti en kuitenkaan riittävän selkeästi.
Minusta sen tarpeellisuutta olisi voinut alleviivata hieman enemmän esimerkiksi jättämällä sen sleep-komennon oletuksena kommentoimatta. Tosin pelkästään tämän takia en olisi vaivautunut kommentoimaan viestiä vaan pääsyy oli tuon komennon väärä sijainti silmukoissa :)
Lisäksi se pitää sijoittaa ulompaan silmukkaan tai muuten siitä ei ole mitään iloa.
Sleep-komennon paikalla ei näiden looppien välillä liene mitään käytännön merkitystä; se nukuttaa ohjelman kuitenkin halutuksi hetkiseksi. Minulla se vain vaikutti toimivan keskiloopin sisällä paremmin kuin ulomman.
Sisemmän silmukan sisällä sleep suoritetaan vain kerran firefoxin käynnistämisen jälkeen. Tämän jälkeen ulompi silmukka pyörii "täysillä" koska sisempää silmukkaa ei suoriteta lainkaan firefoxin ollessa käynnissä.