Portál AbcLinuxu, 10. května 2025 09:58

Dotaz: Bash: Jak zastavím for((;;)) cyklus?

David Watzke avatar 21.12.2005 20:19 David Watzke | skóre: 74 | blog: Blog... | Praha
Bash: Jak zastavím for((;;)) cyklus?
Přečteno: 424×
Odpovědět | Admin
Ahoj. Napsal jsem si initskript pro Gentoo. Musí mimo jiné obsahovat: jak službu nastartovat, ukončit a restartovat. Takže:
start() {
 for((;;))
  do
   echo "$(date +%F) @ $(date +%T) :: $(cpuload | awk {'print$2'})%" >> /home/david/stats/now
  done
}

stop() {
 mv /home/david/stats/now /home/david/stats/$(date +%F)-at-$(date +%T).log
}

restart() {
 mv /home/david/stats/now /home/david/stats/$(date +%F)-at-$(date +%T).log
 for((;;))
  do
   echo "$(date +%F) @ $(date +%T) :: $(cpuload | awk {'print$2'})%" >> /home/david/stats/now
  done
}
No a díky tomu jsem se dostal k tomu, že neumím ukončit for cyklus. Na začátku stop() a restart() mi to chybí. Nevíte prosím jak na to?
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Nástroje: Začni sledovat (1) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

21.12.2005 20:37 roman
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Odpovědět | | Sbalit | Link | Blokovat | Admin
to zalezi co xces dat do cyklu.
David Watzke avatar 21.12.2005 20:39 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Co 'xci' dát do cyklu píšu v dotazu.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Luboš Doležel (Doli) avatar 21.12.2005 20:46 Luboš Doležel (Doli) | skóre: 98 | blog: Doliho blog | Kladensko
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pokud správně chápu o co se snažíš, tak musíš dát ten cyklus odděleně (asi) do skriptu a ve startu ten skript spouštět jako démon. Ve stopu mu poslat SIGTERM.
David Watzke avatar 21.12.2005 20:55 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
To bude asi to, co potřebuju... díky.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
21.12.2005 20:48 Zdeněk Burda | skóre: 61 | blog: Zdendův blog | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Ahoj,

asi mi něco uteklo, ale co je konečným cílem tvé snahy?

Jeslti si chceš dělat nějakej graf toho co se jak dlouho spouští, tak se vyprdni na samodělky a podívej se na bootchart.

Ukončení for cyklu: co zkusit příkaz break v tom for cyklu?
-- Nezdar není hanbou, hanbou je strach z pokusu.
David Watzke avatar 21.12.2005 20:54 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Ne, jen to takhle logovat, nic víc.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Heron avatar 21.12.2005 20:50 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Odpovědět | | Sbalit | Link | Blokovat | Admin

Především by bylo vhodně, dělat restart voláním procedur stop a start, nikoliv copy-paste jejich obsah.

Potom, když je to systémový skript, tak je lepší výsledek ukládat do /var/neco, než do /home

Co takhle nekonečný for nahradit smyčkou while a jako podmínku tam dát test existence nejakého souboru? Pokud soubor přestane existovat (tj. ve stop se smaže), tak se jednoduše ukončí. To by nešlo?

Heron
David Watzke avatar 21.12.2005 20:55 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
To by šlo, jenže jsem nikdy while smyčku nepsal...
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Heron avatar 21.12.2005 20:58 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Aspoň se to naučíš. Ještě ten skript může umět vracet svůj status podle existence či neexistence toho run-souboru.
David Watzke avatar 21.12.2005 21:07 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Problém je v tom, že neumím otestovat existenci souboru.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
21.12.2005 21:18 David Jaša | skóre: 44 | blog: Dejvův blog
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
man test
a ještě: [ je hardlink na test ;-)
David Watzke avatar 21.12.2005 21:27 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Dík.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Heron avatar 21.12.2005 20:56 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Odpovědět | | Sbalit | Link | Blokovat | Admin

Tak mě napadá, že tam nikde není sleep. Nebo je už v tom cpuload?

Heron
David Watzke avatar 21.12.2005 20:58 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Přesně tam je. :-) Jede to každých 5 sekund.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 22.12.2005 06:21 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Odpovědět | | Sbalit | Link | Blokovat | Admin
Takže pro úplnost. Celý zázrak je v tom, že cpuload každých 5 sekund zapíše zatížení procesoru do statistiky. Zdrojový kód cpuload je zde (díky, Doli), /etc/init.d/cpustats vypadá takto:
start() {
        cpuloadd &
}

stop() {
 if [ -f /home/david/stats/now ]
  then
   mv /home/david/stats/now /home/david/stats/$(date +%F)-at-$(date +%T).log
   killall cpuloadd cpuload
  else
   killall cpuloadd cpuload
 fi
}

restart() {
 svc_stop
 svc_start
}
a cpuloadd obsahuje:
#! /bin/bash

doIt() {
 for((;;))
  do
   echo "$(date +%F) @ $(date +%T) :: $(cpuload | awk {'print$2'})%" >> /home/david/stats/now
  done
}

if [ -f /home/david/stats/now ]
 then
  mv /home/david/stats/now /home/david/stats/$(date +%F)-at-$(date +%T).log
  doIt
 else
  doIt
fi
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Heron avatar 23.12.2005 09:45 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
if [cond]
   ...
   doIt
else
   doIt
fi

Stejný příkaz v obou větvích ifu?

David Watzke avatar 23.12.2005 09:49 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
To v cpuloadd je tam jen aby když při startu existuje now ho přesunul a zapisoval do novýho. No a v tom initskriptu je to zase o zabití...
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
Heron avatar 23.12.2005 09:59 Heron | skóre: 53 | blog: root_at_heron | Olomouc
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?

To si asi nerozumíme. Mě je jedno, co ten příkaz doIt dělá a v jakém je skriptu. Zajímá mě, proč je v obou větvích ifu stejný příkaz (tedy vykoná se, ať podmínka ifu dopadne jakkoliv)

Místo:

if [cond]
   ...
   doIt
else
   doIt
fi

Lze přece jednoduše psát:

if [cond]
   ...
fi

doIt
David Watzke avatar 23.12.2005 10:00 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Jo aha, to mi... nedošlo. :-(
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 23.12.2005 18:12 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Rád bych se ještě zeptal na jednu věc. Chtěl bych, aby po startu toho initskriptu zkontroloval zda existuje složka /var/stats a když ne, aby jí vytvořil. V manuálu testu kontrole zda soubor NEexistuje nic není (když neexistuje aby vrátil exit 0 a když jo, tak 1). Musím tedy napsat if s nějakým zbytečným echem, nebo to test umí a postačí while?
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 23.12.2005 19:14 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Napadlo mě ještě:
ls /var/stats &> /dev/null
while [ $? != 0 ]
 do
  mkdir -p /var/stats
 done
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
David Watzke avatar 23.12.2005 19:15 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Heh, spíš ten test, co... :-D
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon
23.12.2005 20:02 8an | skóre: 30
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Negace se dělá "!", třeba
if [ ! -f "$FILE" ]; then
  echo "$FILE not found"
fi
If you build an operating system that even an idiot can use, only idiots will use it.
David Watzke avatar 23.12.2005 20:43 David Watzke | skóre: 74 | blog: Blog... | Praha
Rozbalit Rozbalit vše Re: Bash: Jak zastavím for((;;)) cyklus?
Jo aha, to se může taky. :-) Děkuji.
“Being honest may not get you a lot of friends but it’ll always get you the right ones” ―John Lennon

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.