prijava O stranici čpp

Jednostavna bash scripta:

while :; do
   echo "pre sleep"
   sleep 20
   echo "post sleep"
done

Kada se ovoj scripti poshalje SIGTERM, scripta se zavrshi, ali sleep ostane i dalje. Kako reshiti problem da cim scripti posaljem TERM signal, svi podprocesi se zavrshe?

Naravno, ovo nije problem kad je sleep u pitanju, ali ako umesto sleepa imam rsync, on ce nastaviti da radi i radi dok ne zavrshi svoj posao, shto naravno ne zelim da se desi.

Nashao sam neko rogobatno reshenje u zsh-u, u bash-u nisam nashao nikakvo, ali je reshenje u zsh ruzno i nezgrapno za ovako jednostavnu stvar. Postoji shansa da sam ja neshto prevideo (zato i postavljam pitanje).

pitano Sep 06 '10 at 22:53

zsteva's gravatar image

zsteva
3111111


Uhvatis PID, pa ga eksplicitno ubijes:

while :; do
   echo "pre sleep"
   sleep 20 &
   SLEEP_PID = $!
   wait $SLEEP_PID
   echo "post sleep"
done

i sad kad trap-ujes EXIT mos da ubijes po PID-u

odgovoreno Sep 07 '10 at 12:15

Luka's gravatar image

Luka
1614910

uređeno Sep 07 '10 at 12:15

odlicno!, i u zsh sam morao ovo ovako da uradim, ali deo kako jednostavno ubiti process mi nije bio ovako jednostavan. I shto je najlepshe u bash-u radi kako treba, jer kad je bash u wait onda se trap odmah izvrshi.

(Sep 07 '10 at 12:22) zsteva

Pokusaj da prosledis negativan pid kill komandi -- trebalo bi da da signal svim procesima sa istim pgid-om (process group id). Dakle kill -15 -12859. Pre toga, pogledaj izlaz komande ps xjf, i kolonu PGID.

Jedna opaska u vezi sa resenjem koje je dao @Luka: ako se ne varam, POSIX nalaze da shell koji dobije signal dok ceka na child proces handler izvrsava tek nakon sto wait regularno odradi svoj posao. Zbog ovoga FreeBSD sh ima nestandardnu opciju -T, zahvaljujuci kojoj se sh ponasa slicno bash-u -- handler se aktivira cim je dobijen signal.

odgovoreno Oct 04 '10 at 18:34

bojan's gravatar image

bojan
313

uređeno Oct 04 '10 at 19:26

Kod mene se opisani problem ne dogadja, sto je i logicno jer bi procesi trebali biti u istoj procesnoj grupi, i svi bi trebali dobiti SIGTERM signal.

odgovoreno Sep 06 '10 at 23:45

%D0%B4%D0%B0%D0%BC%D1%98%D0%B0%D0%BD's gravatar image

дамјан
312

hmm.. meni je isto ovo cudno ponashanje, ali probano vishe puta ovo sa sleep, a i prava scripta gde je rsync.

(Sep 06 '10 at 23:54) zsteva

hmm² .. danas kako testiram i kod mene je isto.. mora da sam juce prespavao taj "sleep" :)

(Sep 07 '10 at 15:58) дамјан

bitno da Luka ima reshenje ;) I to relativno elegantno.

vec sam se spremao da krenem kodiranje scripti u perlu :)

(Sep 07 '10 at 15:59) zsteva

bash ima hookove za signale. hook moze ubiti bitne procese da ne ostanu visiti i ugasiti skriptu.

callback() { echo callback exit 1 }

trap callback EXIT

tvoje stvari..

sleep 20

trap - EXIT echo natural exit

odgovoreno Sep 06 '10 at 23:44

lesh's gravatar image

lesh
146239

trap se kod bash-a izvrshava tek posle komande koja se trenutno izvrshava (u gornjem primeru sleep) tako da to nikako ne vrshi posao.

kod zsh, postoji setopt TRAPS_ASYNC, koji onda izgrshi trap odmah, ali onda treba nekako ubiti podprocese.

(Sep 06 '10 at 23:48) zsteva

savjet: ako koristite bash-izme, nemojte u hashbang staviti

!/bin/sh

to je vjerojatno dash ili nešto drugo!

(Sep 14 '10 at 20:49) dpavlin
zsteva@acer:~/cvsworkspace/examples/bash/signal_exit$ ./ss1.sh 
[s1:8688] pre sleep
Terminated
zsteva@acer:~/cvsworkspace/examples/bash/signal_exit$ ps -ef | grep sleep
zsteva    8689     1  0 23:53 pts/5    00:00:00 sleep 20
zsteva    8692  5922  0 23:53 pts/5    00:00:00 grep --color=auto sleep
zsteva@acer:~/cvsworkspace/examples/bash/signal_exit$

odgovoreno Sep 06 '10 at 23:55

zsteva's gravatar image

zsteva
3111111

Evo jos jedan primer sa druge mashine. (Dobro obe su ubuntu). Ajde nek neko proba ovaj scenario kod sebe. Pitanje i dalje stoji!!! I proshirenje: gde greshim?

zsteva@zeljkos:~$ ./ss1.sh &
[1] 12859
zsteva@zeljkos:~$ 12859 pre sleep
ps -ef | grep 12859
zsteva   12859  7749  0 07:56 pts/8    00:00:00 /bin/bash ./ss1.sh
zsteva   12860 12859  0 07:56 pts/8    00:00:00 sleep 20
zsteva   12862  7749  0 07:56 pts/8    00:00:00 grep --color=auto 12859
zsteva@zeljkos:~$ kill 12859
zsteva@zeljkos:~$ ps -ef | grep sleep
zsteva   12860     1  0 07:56 pts/8    00:00:00 sleep 20
zsteva   12864  7749  0 07:56 pts/8    00:00:00 grep --color=auto sleep
[1]+  Terminated              ./ss1.sh
zsteva@zeljkos:~$

odgovoreno Sep 07 '10 at 07:58

zsteva's gravatar image

zsteva
3111111

Vaš odgovor
toggle preview

Follow this question

By Email:

Once you sign in you will be able to subscribe for any updates here

By RSS:

Odgovora

Answers and Comments

Oznake pitanja:

×1
×1
×1
×1
×1

question asked: Sep 06 '10 at 22:53

question was seen: 2,017 times

last updated: Oct 04 '10 at 19:26

Povezana pitanja

powered by OSQA