Příkaz o dvou částech na pozadí

fotka

  • ***
  • 216
    • Zobrazit profil
    • Linux forum
    • E-mail
Příkaz o dvou částech na pozadí
« kdy: 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
« Poslední změna: 18. 04. 2015, 18:45:24 od Petr Krčmář »
Linux nováček - CeskeForum.com


fotka

  • ***
  • 216
    • Zobrazit profil
    • Linux forum
    • E-mail
Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #1 kdy: 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
Linux nováček - CeskeForum.com

Dzavy

Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #2 kdy: 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.

nobody

Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #3 kdy: 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 :)

fotka

  • ***
  • 216
    • Zobrazit profil
    • Linux forum
    • E-mail
Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #4 kdy: 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
Linux nováček - CeskeForum.com


OMG

Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #5 kdy: 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?

nobody

Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #6 kdy: 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

udelej druhej script za4hodiny.sh, do nej dej jak dlouho ma cekat a co ma delat, a v tom prvnim dej jen za4hodiny.sh &

JardaP .

  • *****
  • 11 064
    • Zobrazit profil
    • E-mail
Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #7 kdy: 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.

fotka

  • ***
  • 216
    • Zobrazit profil
    • Linux forum
    • E-mail
Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #8 kdy: 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)
Linux nováček - CeskeForum.com

fotka

  • ***
  • 216
    • Zobrazit profil
    • Linux forum
    • E-mail
Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #9 kdy: 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
Linux nováček - CeskeForum.com

Rejpal

Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #10 kdy: 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!

whata

Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #11 kdy: 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.

fotka

  • ***
  • 216
    • Zobrazit profil
    • Linux forum
    • E-mail
Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #12 kdy: 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.
Linux nováček - CeskeForum.com

nobody

Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #13 kdy: 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 &

nobody

Re:Spuštění příkazu o dvou částech na pozadí z bash skriptu
« Odpověď #14 kdy: 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 &