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: hicadsum 26 Září 2009, 13:21:31

Název: problém s naplánováním úkolu
Přispěvatel: hicadsum 26 Září 2009, 13:21:31
Mám problém se spuštěním úkolu ve stanoveném čase po probuzení z hibernace (uspání na disk):
1. naplánuji úkol - skript pro nahrávání v mencoderu pomocí at:
Citace
#!/bin/sh
echo "Nahrávať od HH:MM:"
read zaciatok
echo "Zadaj dobu nahrávania v sekundách:"
read doba
echo "mencoder tv:// -tv driver=v4l2:buffersize=64: -ovc lavc -lavcopts vcodec=libxvid:vbitrate=1800:aspect=4/3 -oac mp3lame -vf pp=fd,denoise3d=3:4:6 -ffourcc DIVX -endpos $doba -o test.avi" > /home/hic/Plocha/progr.txt
sudo at $zaciatok -f /home/hic/Plocha/progr.txt
echo "Nahrávať sa bude od $zaciatok po dobu $doba s."
2. nastavím probuzení PC z hibernace skriptem:
Kód: [Vybrat]
#!/bin/sh
echo "Zadaj dátum a čas nahrávania vo formáte podľa príkladu: Sep 21, 2009 20:50:30"
echo "----------------------------------------------------"
echo "mesiace: Jan, Feb, Mar, Apr, May, Jun, Jul, Aug, Sep, Oct, Nov, Dec"
read datum
# vynuluje počítadlo rtc času do spustenia/prebudenia PC:
sudo bash -c "echo 0 > /sys/class/rtc/rtc0/wakealarm"
# prepočíta zadaný čas a dátum nahrávania (CEST) na čas v UTC: UTC=CEST-7200:
# 1. počet sekúnd od 1.1.1970 do času nahrávania v CEST:
recCEST=`date -u --date "$datum" +%s`
recUTC=$((recCEST-7200))
# teraz sa vypočíta čas spustenia počítača recUTC - 5 min. (predstih spustenia PC pred zaciatkom nahrávania 300s):
start=$((recUTC-300))
# zadá v predchádzajúcom výpočte vypočítaný počet sekúnd do spustenia počítača (so zarátaným predstihom):
sudo bash -c "echo $start > /sys/class/rtc/rtc0/wakealarm"
echo "Počítač sa zapne 300s pred začiatkom nahrávania."
3. uspím počítač na disk
Problém: PC se správně probudí v nastaveném čase, nicméně mencoder se nespustí v specifikovanou dobu $zaciatok, ale z nějakého důvodu, na který nejsem schopný přijít se spuštění opozdí o cca 4 minuty. Systém je nazatížen, CPU 0-1%. Když skript pro nahrávání spustím na běžícím počítači, mencoder nahrává jak jsem nastavil přesně od času $zaciatok.
Neví někdo co s tím?
Díky.
PS.: Zjistil jsem, že spuštění mencoderu (nebo jiného úkolu) naplánované démonem atd proběhne správně po restartu/ normálním spuštění počitače. Problém je pouze v jejich spuštění po probuzení z hibernace! Napadlo mně, že třeba atd po probuzení z hibernace neběží, ale to by se úkol nespustil vůbec - a on se sice spouští, ale z nepochopitelného důvodu opožděně o cca 3,5 min. Navíc, když hned po probuzení na zkoušku naplánuji úkol pomocí příkazu at se zadáním do terminalu v nejbližší minutě, úloha se spustí správně.
S cron-em takový problém není, po probuzení z hibernace spustí obecný úkol v přesně stanoveném čase, ale když například zadám spuštění skriptu (konkrétní případ, který mě zajímá), spustí se nahrávání jen na cca 1s a poté se hned ukončí - ač takové ukončení není stanoveno:

Kód: [Vybrat]
51 2 27 9 0 /home/hic/nahravanie.sh
Kód: [Vybrat]
#!/bin/sh
mencoder tv:// -tv driver=v4l2:buffersize=64: -ovc lavc -lavcopts vcodec=libxvid:vbitrate=1800:keyint=25:aspect=4/3 -oac mp3lame -vf pp=fd,denoise3d=3:4:6 -ffourcc DIVX -o test.avi


Název: Re: problém s naplánováním úkolu
Přispěvatel: hicadsum 27 Září 2009, 15:12:15
Tak jsem si to vyřešil. Jak jsem psal, po probuzení z hibernace atd nespustil nahrávání v naplánovanou dobu, cron sice ano, ale nefungovalo to korektně - z mně neznámého důvodu se nahrála pouze cca 1s záznamu. Řešením je pro mně skript, spuštěný po probuzení z hibernace cron-em, který předá atd pokyn spustit nahrávání ve stanovenou dobu. Vypadá to nějak takhle:
1. spustím skript k nastavení probuzení ze suspend2disk ve stanovenou dobu (s dostatečným předstihem aby PC naběhl - u mně nabíhá 45s, tak jsem předstih nastavil na 120s) - abych se nemusel příliš zatěžovat, do skriptu zadávám přímo čas spuštění úkolu po probuzení, spočítá se to a zadá samo... (viz výše)
2. nastavím cron ke spuštění skriptu 1.sh, naplánuje spuštění skriptu 2.sh:

1.sh:
Kód: [Vybrat]
#!/bin/bash
at -f /home/hic/Plocha/2.sh 1455

2.sh:
Kód: [Vybrat]
#!/bin/bash
mencoder tv:// -tv driver=v4l2:buffersize=64: -ovc lavc -lavcopts vcodec=libxvid:vbitrate=1800:keyint=25:aspect=4/3 -oac mp3lame -vf pp=fd,denoise3d=3:4:6 -ffourcc DIVX -o test.avi -endpos 60

skript 2.sh již přímo spouští nahrávání, které proběhne přesně v nastavenou dobu (tady ve 14:55) a trvá právě těch na zkoušku nastavených 60s.

Zbývá to sepsat do jednoho skriptu, ale to by už neměl být problém :-)