Prosíme přihlašte se nebo zaregistrujte.

Přihlašte se svým uživatelským jménem a heslem.
Vaše pomoc je stále potřeba!

Autor Téma: Jak v bashi na *countdown-timer-to-action* ??  (Přečteno 3188 krát)

nettezzaumana

  • Host
Jak v bashi na *countdown-timer-to-action* ??
« kdy: 12 Listopadu 2008, 01:42:50 »
jak se prosim udela v bashi nejakou metodou odpocitavani zadaneho casu do nejake akce, aby se tisklo na stdout?

napsal jsem takovouhle hloupou metodu, ale rad bych na to pouzil neco, co skutecne pouziva nejakou time-relating funkci ..

diky a zdravi ntz

Citace
#!/bin/bash

DIEIN=$1
TIME=$2
ACTION=$3

if [ -z $DIEIN ] || [ `echo $DIEIN | grep '[^0-9]'` ] || [ ! -z $4 ]; then
    echo "bad parameters"
    echo -e "enter suggested time to action in following format : <int> s|m|h \"action\"\n"
    exit
fi
   
case $TIME in
    s ) SEC=$DIEIN;;
    m ) SEC=$(($DIEIN * 60));;
    h ) SEC=$(($DIEIN * 3600));;
    * )
   echo "bad time format string, use s|m|h"
   echo -e "enter suggested time to end in following format : <int> s|m|h \"action\"\n"
   exit;;
esac

GOGO() {
while [ "$SEC" -gt "0" ]; do
    echo -en "time to action: $HOD hrs $MIN min $VTR sec\r"
    SEC=$(($SEC - 1))
    VTR=$(($SEC % 3600 % 60))
    MIN=$(($SEC / 60 % 60))
    HOD=$(($SEC / 3600))
    sleep 1
done
}

echo
STARTEDAT=$(date)
GOGO
ENDEDAT=$(date)

echo -e "\n\nentered $DIEIN $TIME\nstarted $STARTEDAT\nended $ENDEDAT"

echo -e "action in 5 seconds .."
sleep 5

$ACTION;


.. toto je pomerne znacne nepresne pri vyssich casech .. tipuju to mozna na i na 10tky minut na 100hodin
« Poslední změna: 12 Listopadu 2008, 01:56:50 od nettezzaumana »

ufaak

  • Závislák
  • ***
  • Příspěvků: 2296
Re: Jak v bashi na *countdown-timer-to-action* ??
« Odpověď #1 kdy: 12 Listopadu 2008, 09:54:16 »
no programator nejsem... ale nebylo by reseni pricist do promenne aktualni unix cas + tvuj pozadavek na odpocet, a pak v cyklu jenom kontrolovat, jestli uz nastala ta spravna chvile? to znamena jestli promenna == unix cas?
notebook MSI EX720X, Ubuntu 10.10

kkaarreell

  • Stálý člen
  • **
  • Příspěvků: 1072
Re: Jak v bashi na *countdown-timer-to-action* ??
« Odpověď #2 kdy: 12 Listopadu 2008, 10:43:55 »
Diky za chvilku zabavy v jinak sedem pracovnim dnu. Mozna to neni presne to, co jsi chtel, ale aspon jsem se nenudil. :-)

Kód: [Vybrat]
# countdown.sh
#
# pouziti:   countdown.sh 10:45
#            countdown.sh "Nov 13"
#            countdown.sh "Nov 13 1:30"
#            countdown.sh "Nov 13 1:30 2009"

target=`date -d "$1" +%s`
now=`date +%s`

while [ $target -gt $now ]; do
    diff=$(( $target - $now ))

    secs=`expr $diff % 60`
    diff=`expr $diff - $secs`
    mins=`expr $diff % 3600 / 60`
    diff=`expr $diff - $mins`
    hours=`expr $diff % 86400 / 3600`
    diff=`expr $diff - $hours`
    days=`expr $diff % 604800 / 86400`
    diff=`expr $diff - $hours`
    weeks=`expr $diff / 604800`

    echo -n " $weeks w $days d $hours h $mins m $secs s          "
    echo -ne "\r"     # move cursor to start of line
   
    #sleep 0.5   # toto je lepsi, jenze MINGW, pres ktere to zkousim, umi jen cele nasobky sekund
    sleep 1
    now=`date +%s`
   
done


jinak jsem nasel tato temata, kde se to resi:
http://forums.fedoraforum.org/archive/index.php/t-1766.html
http://ubuntuforums.org/showthread.php?t=455801
« Poslední změna: 12 Listopadu 2008, 13:51:44 od kkaarreell »

DuckD

  • Stálý člen
  • **
  • Příspěvků: 878
  • Open Srdcař
    • www.duckd.cz
Re: Jak v bashi na *countdown-timer-to-action* ??
« Odpověď #3 kdy: 12 Listopadu 2008, 10:58:21 »
Když jsem dělal plánovač úloh pod Win, taky jsem se dostal k té samé otázce.
Když vlákno uspíš od času 0.000 na 1 sekundu, může se probudit v různém čase, v závislosti na vytížení systému (ostatnímy procesy), nevím zda již dříve (např. 0.950), ale určitě může později (např. 1.235) - poněvadž Multitasking.
Nepotřeboval jsem ale tak velké rozlišení a sekunda mě byla ukradená.
Myslím že pro takto přesné odpočítávání muselo běžet více vláken které byly uspávány na krátičkou dobu a komunikovali mezi sebou (pracovalo se ve vlákně, které se probudilo v nejbližším rozsahu chtěného času).

V tvém případě je problém, že uspávání vlákna na sekundu, nebude v konečném součtu odpovídat.
Doporučil bych dvě možnosti:
1) Hlídat aktuální čas každou sekundu a porovnávat zda čas neuplynul.
2) Udělat dvě vlákna.
Jedno by bylo uspáváno každou sekundu a vypisovalo by STDOUT (s velkou prioritou).
Druhé vlákno by se uspávalo na deset sekund a kontrolovalo by aktuální čas, pak by nějakým způsobem předávalo informaci druhému vláknu o tom že proběhlo deset sekund.

Nejsem odborník, ale snažil jsem se helpnout.
8) Lidé žijí v souborech. ===>> LINUXTERO <<=== Pravidelná dávka tvého linuxtera!

nettezzaumana

  • Host
Re: Jak v bashi na *countdown-timer-to-action* ??
« Odpověď #4 kdy: 12 Listopadu 2008, 12:04:42 »
@kkaarreell .. to tvoje je taky hezke, nicmene je to stejne jako moje akorat v blede modrym ;) (no, asi je to trocha hezci diky), pac to pouziva stejne jako moje odecitani casu pomoci `sleep n` ..
ps. `sleep 0.5` bude mnohem nepresnejsi nez `sleep 60` ..

@DuckD .. :) diky za radu .. tak nejak si to predstavuju, ted mi ale dovol citovat velikana ::

keci jsou levny, ukaz kod..!
« Poslední změna: 12 Listopadu 2008, 12:08:04 od nettezzaumana »

kkaarreell

  • Stálý člen
  • **
  • Příspěvků: 1072
Re: Jak v bashi na *countdown-timer-to-action* ??
« Odpověď #5 kdy: 12 Listopadu 2008, 12:51:23 »
@kkaarreell .. to tvoje je taky hezke, nicmene je to stejne jako moje akorat v blede modrym ;) (no, asi je to trocha hezci diky), pac to pouziva stejne jako moje odecitani casu pomoci `sleep n` ..
ps. `sleep 0.5` bude mnohem nepresnejsi nez `sleep 60` ..
no, jeden rozdil tam je.. ty po tom "sleep 1" odecitas vterinu od zbyvajici doby, zatimco ja tam mam ten sleep jen jako "delay" a skutecny cas co zbyva zjistuju vzdy znova pomoci "date".  Takze ten muj skript ma odchylku cca 1 vterina +/- (spis plus), ale uz je jedno, jestli ho nastavis na 5 vterin a nebo na tyden.

To sleep 0.5 (ci neco jeste mensiho) jsem chtel prave kvuli tomu, abych ten "delay" zjemnil a nestavalo se tak, jak je to pri "sleep 1", ze counter poskoci o 2 vteriny najednou kvuli "zdrzeni", jez zpusobuje vykonavani prikazu samotnych. Ale to je spis esteticke kriterium.

nettezzaumana

  • Host
Re: Jak v bashi na *countdown-timer-to-action* ??
« Odpověď #6 kdy: 12 Listopadu 2008, 13:34:05 »
@kkaarreell << yep. mas pravdu. dik

 

Provoz zaštiťuje spolek OpenAlt.