Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: 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
-
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
-
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.
-
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 :)
-
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
-
... 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?
-
/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 &
-
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.
-
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)
-
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
-
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!
-
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.
-
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.
-
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:
#!/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 &
-
jinak celej odstavec if...fi lze nahradit timto:
[[ $(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
[[ $(ps x | grep "sleep 14400" | grep -v grep) ]] && echo "sleep bezi, nic nepoustim" || echo "sleep nebezi, poustim"; bufferemptier &
-
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?
-
Fotka, nikdy nesklameš. Tá ponuka na odpredaj tých SD kariet stále platí, ešte to chceš používať v hostingu?
-
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.
-
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.