Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: fotka 17. 04. 2015, 11:36:24

Název: Příkaz o dvou částech na pozadí
Přispěvatel: fotka 17. 04. 2015, 11:36:24
Spuštění příkazu o dvou částech na pozadí z bash skriptu
jak to prosím provést?

skript se spouští každých 10 minut a příkaz ve skriptu který chci spustit na pozadí (aniž by skript čekal na dokončení příkazu):
sleep 14400;>/root/vbullcheck/buffer

bude to fungovat když dám do skriptu
command=$(sleep 14400;>/root/vbullcheck/buffer)
$command &

? nebo jak jinak lépe to udělat? jde o to aby se skript spouštěl každých 10 minut, dělám cronem a ten uvedený příkaz aby se spouštěl každých 4 hodin, nechci ale pokud možno na ten 4 hodinový příkaz nastavovat samostatný cron.. díky
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: fotka 17. 04. 2015, 11:51:22
počítám, že je asi ještě potřeba kontrolovat aby se to nespustilo více než jednou ten příkaz:
bufferemptier=$(sleep 14400;>/root/vbullcheck/buffer)
if [ "$(ps x | grep "sleep 14400" | wc -l)" -gt "1" ];then
$bufferemptier &
fi
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: Dzavy 17. 04. 2015, 12:07:06
Tyvoe co to zase je?

Kazdych deset minut budes kontrolovat, jestli mas na ctyri hodiny uspanej prikaz a kdyz ne, tak ho uspis?

Mozna by pomohlo napsat slovy co to ma konkretne delat.
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: nobody 17. 04. 2015, 12:11:54
asi ??? preci urcite !!! :) pokud nechces kazdejch 10minut poustet neco po 4h, tedy to neco by se pak poustelo taky po 10minutach :)

jinak to co poustis, je vlastne jenom sleep, kde po nem se pusti presmerovani prazdna do souboru buffer, to asi nechces :)

a nakonec zjistujes jestli sleep 14400 bezi vickrat nez 1, tedy vzdy ti pak pobezi 2x sleep, to asi taky nechces :)

myslim ze jednodusi bude opravdu udelat 2 crony poustejici 2 ruzne scripty :)
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: fotka 17. 04. 2015, 12:19:36
ano, f tom IF (můj druhý příspěvek) je chyba místo -gt by se dalo asi dát -ne "1"
ale ani tak to nefunguje a skript se zasekne a spí, nespustí se to na pozadí
druhým cronem to nechci řešit pokud možno a nebo to dát vše do jednoho cronu ale nevím jak
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: OMG 17. 04. 2015, 12:26:54
... jde o to aby se skript spouštěl každých 10 minut, dělám cronem a ten uvedený příkaz aby se spouštěl každých 4 hodin, nechci ale pokud možno na ten 4 hodinový příkaz nastavovat samostatný cron.. díky
takze si chces napsat neco jako vlastni cron?  ::)
Te zabije pouzit cron?
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: nobody 17. 04. 2015, 12:35:27
/root/vbullcheck/buffer je co ? je to nejaky druhy script ? pokud ano, tak jak sem psal, presmerovavas do nej nic, takze pri prvnim dobehnuti sleep 14400; >/root/vbullcheck/buffer z neho bude prazdnej soubor a nic se po sleepu nepusti, krome toho presmerovani prazdna :)

-ne misto -gt je taky blobost, protoze pak by to v pripade ze by se z nejakeho duvodu jeden sleep neukoncil, startovalo porad dalsi a dalsi sleep+command protoze by bylo 2 a vice... takze spravne je -ge (vetsi nebo stejne) viz porovnavaci operatory (http://tldp.org/LDP/abs/html/comparison-ops.html)

udelej druhej script za4hodiny.sh, do nej dej jak dlouho ma cekat a co ma delat, a v tom prvnim dej jen za4hodiny.sh &
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: JardaP . 17. 04. 2015, 12:37:28
Kristova noho, to se mi ulevilo! Kdyz jsem na to koukal, tak jsem se zdesil, ze vubec nechapu, co to ma delat, ale pak se ukazalo, ze to je normalni.
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: fotka 17. 04. 2015, 12:52:09
nobody: díky za postřeh a konstruktivní post.

ano, účelem je vyprázdnění souboru buffer.
ten tvůj operátor -ge tu je asi nevhodný, já potřebuji výmaz spustit pouze pokud již neběží (s příkazem sleep)

proto je asi vhodné (do třetice všeho dobrého) použít operátor "-lt" (less than), pokud ps -x nalezne méně jak 2 procesy s "sleep 14400", znamená to, že výmaz se sleepem neběží (1 proces by měl být samotný ps x)
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: fotka 17. 04. 2015, 12:56:45
aktuání podoba:
set -ex
bufferemptier="$(sleep 14400;>/root/vbullcheck/buffer) &"
if [ "$(ps x | grep "sleep 14400" | wc -l)" -lt "2" ];then
ps x | grep "sleep 14400" | wc -l
echo "mene nez 2 sleep procesy"
$bufferemptier
fi

výsledek je to, že skript asi spí (nic se nezobrazuje) a po Ctrl+C ps aux | grep sleep neukazuje žádné 14400
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: Rejpal 17. 04. 2015, 14:02:21
Mám připomínku na administrátory zdejšího fóra:

Nebylo by vhodnější upravit popisky aktivity uživatelů tak, aby místo "Pokročilý uživatel" se zobrazovalo "Pokročilý uživatel diskusního fóra"? IMHO je to daleko přesnější formulace a nebyla by tak (zejména v tomto případě) zavádějící.

Děkuji!
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: whata 17. 04. 2015, 15:45:17
Drsna reseni v patecni podvecer...

$ se bude interpretovat prilis brzo a v druhe pripade vubec.
Bud cele hodit do apostrofu a u execute pustit eval. Nebo lepe napsat do funkce a pustit funkci na pozadi.

... pomijim fakta jako, ze tam muze bezet jakykoli jiny sleep; nechapu to cekani, kdyz se to stejne pousti kazdych deset minut a v dusledku je tedy vlastne jedno, jestli se truncate provede ted nebo za 1440 vterin; atd. atd.
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: fotka 17. 04. 2015, 15:49:30
whata: díky za pokus o řešení problému, bohužel jako samouk amatér a nechápu vůbec o čem je řeč. Kdyby byl příklad asi bych spíše pochopil co navrujete.
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: nobody 17. 04. 2015, 18:21:36
whata: musel by bezet jinej "sleep 14400"
cekani ma proto ze chce aby se to poustelo jen 1x za 4h, proto kontroluje jestli bezi a kdyz ne,
tak ho teprve pusti, takze se ma po 4h:10m pustit vycisteni souboru buffer

fotka: tak jak si to mel je spatne to, ze ty do promene bufferemptier davas vysledek toho v $() uz v te chvili
bufferemptier="$(sleep 14400;>/root/vbullcheck/buffer) &"
navic na pozadi nebezi nic, protoze & maz az za ) a tedy se to prida za vysledek $(), kterej v tomto pripade nebude nic, takze
po 4h by promena $bufferemptier obsahovala " &" :)

pokud neco neprehlizim, jako v pripade me rady ge :) melo by to byt takto:

Kód: [Vybrat]
#!/bin/sh

set -ex

bufferemptier(){
    sleep 14400
    >/root/vbullcheck/buffer
}

if [ "$(ps x | grep "sleep 14400" | wc -l)" -lt "2" ];then
    ps x | grep "sleep 14400" | wc -l
    echo "mene nez 2 sleep procesy"
    bufferemptier &
fi

tzn, zadna promena v ktere by se to poustelo hned, ale definovani funkce, jejiz obsah se provede az v momentu zavolani, kde tady to volas na pozadi pomoci: bufferemptier &
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: nobody 17. 04. 2015, 18:32:50
jinak celej odstavec if...fi lze nahradit timto:
Kód: [Vybrat]
[[ $(ps x | grep "sleep 14400" | grep -v grep) ]] || bufferemptier &grep -v grep odstrani radku obsahujici grep, tedy vystup bude bud prazdno(nebezi sleep) nebo radek se sleep (bezi)
to za || se provede jen v pripade ze je problem, tedy vystup z promene v [[ ]] je prazdno

muzes pridat i detekci jestli bezi a zobrazeni textu, v pripade cronu by text byl presmerovanej do cron logu, kterej se posle mailem na root
Kód: [Vybrat]
[[ $(ps x | grep "sleep 14400" | grep -v grep) ]] && echo "sleep bezi, nic nepoustim" || echo "sleep nebezi, poustim"; bufferemptier &
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: karel 17. 04. 2015, 19:50:12
Není to trochu nebezpečné/nejednoznačné kontrolovat, jestli existuje "sleep 14400" přes příkaz ps?
Nebylo by lepší použít zámek - třeba pomocí flock?
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: Peter 17. 04. 2015, 20:23:53
Fotka, nikdy nesklameš. Tá ponuka na odpredaj tých SD kariet stále platí, ešte to chceš používať v hostingu?
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: jardaa 17. 04. 2015, 20:25:55
OMG a co takhle standardní rotace logů? Na netu je toho určitě plno a máš jistotu, že takový soubor určitě není otevřený pro zápis tvým příkazem.
Název: Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
Přispěvatel: Peter 18. 04. 2015, 09:08:32
Neblbni Jardaa,
Fotka si chce nahradiť sytémové komponenty distribúcie na ktorej mu beží hosting nejakými menej náročnými skriptami. On nikdy nesklame zo svojími otázkami.