Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: [bash] zabic skrypt i wszystkie childy

Siema,

walcze z takim problemem, mam skrypt ktory uruchamia kilka procesow w tle, czeka troche czasu i zabija wszystko, na koncu skryptu jest:

kill -9 0


co zabija cale drzewko procesow

problem w tym ze jak uruchamiam ten skrypt z poziomu innego skryptu basha to ten nadrzędny rowniez jest zabijany, pytanie jak zrobic aby zabic wszystke podprocesy danego skryptu ale nie ruszac "rodzicow" ?

konto usunięte

Temat: [bash] zabic skrypt i wszystkie childy

Proces o id 0 to przecież init, czyli ten którego jajko odpaliło jako pierwsze. Chcesz chyba ubić "$$" patrz tutaj

Chyba że czegoś oczywistego nie rozumiem.Łukasz M. edytował(a) ten post dnia 05.07.12 o godzinie 19:22
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: [bash] zabic skrypt i wszystkie childy

jak mam kill -9 $$ zabija mi jedynie basha, ale inne procesy w tle zostaja :/
jak zabic childy wszystkie w takim razie?

konto usunięte

Temat: [bash] zabic skrypt i wszystkie childy

Zabicie procesu 0 uwala wszystkie procesy pewnie dlatego, że to jest właśnie init. Jakoś nigdy nie przyszło mi do głowy tego sprawdzać.

hint?

EDIT: 0 ma najwyraźniej scheduler a nie init.Łukasz M. edytował(a) ten post dnia 05.07.12 o godzinie 19:38
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: [bash] zabic skrypt i wszystkie childy

kurde probowalem i dalej dupa, ogolnie nie chce zabijac calej sesji, jedynie dzieciaki danego skryptu basha, i za cholere nie chce mi to zadzialac :/
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: [bash] zabic skrypt i wszystkie childy

dobra, dalo rade w koncu :D

rozwiazanie tyłka nie urywa ale działa:

w skrypcie jest
kill -9 0
co zabija cale drzewko

natomiast sam skrypt jest uruchamiany z poziomu innego skryptu w taki sposob:
setsid ./dupa.sh
Jan Szubiak

Jan Szubiak RHCA/RHCSS/RHCDS,
LinuxPolska

Temat: [bash] zabic skrypt i wszystkie childy

Łukasz M.:
Proces o id 0 to przecież init, czyli ten którego jajko odpaliło jako pierwsze. Chcesz chyba ubić "$$" patrz tutaj

Chyba że czegoś oczywistego nie rozumiem.

że łot ?, proces o id=1 to init :-)

Pozdr,
J.Sz
Michał Panasiewicz

Michał Panasiewicz Administrator
systemów, sieci i
aplikacji.

Temat: [bash] zabic skrypt i wszystkie childy

Jan Szubiak:
Łukasz M.:
Proces o id 0 to przecież init, czyli ten którego jajko odpaliło jako pierwsze. Chcesz chyba ubić "$$" patrz tutaj

Chyba że czegoś oczywistego nie rozumiem.

że łot ?, proces o id=1 to init :-)
jak najbardziej, 1 to init, 0 to proces bezczynności (idle process,stara nazwa swapper).
Kto wpadł na pomysł zabijania go w skrypcie ???

ppid ciebie interesuje
przykład poniżej (ale nie rekurencyjny), na szybko:
pid=$$ - pid skryptu


for child in $(ps -o pid,ppid -ax | awk "{ if ( \$2 == $pid ) { print \$1 }}")
do
kill $child
done


PS:
dodatkowa uwaga: pamiętać należy że init ma kilka implementacji które go zastępują (uwaga dla tych którzy automatycznie /etc/inittab chcą edytować - systemd, upstart, itd.):

# ls /etc/inittab
ls: nie ma dostępu do /etc/inittab: Nie ma takiego pliku ani katalogu
Michał Panasiewicz edytował(a) ten post dnia 10.07.12 o godzinie 20:01

konto usunięte

Temat: [bash] zabic skrypt i wszystkie childy

Łukasz C.:
Siema,

walcze z takim problemem, mam skrypt ktory uruchamia kilka procesow w tle, czeka troche czasu i zabija wszystko, na koncu skryptu jest:
A co te procesy robią, że nie kończą same i musisz je zabijać?
W normalnych warunkach jak zabijesz proces rodzica to zabije również child procesy.
problem w tym ze jak uruchamiam ten skrypt z poziomu innego skryptu basha to ten
nadrzędny rowniez jest zabijany, pytanie jak zrobic aby zabic wszystke podprocesy
danego skryptu ale nie ruszac "rodzicow" ?

Skoro skrypt 1.sh ładuje 2.sh to w skrypcie 1 dopisz łapanie PID procesu 2.sh i zabijaj tylko ten konkretny PID, a razem z tym PID powinny paść child procesy (ale nie muszą bo nie wiemy co one robią i jak wywoływane).
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: [bash] zabic skrypt i wszystkie childy

Arkadiusz Z.:
A co te procesy robią, że nie kończą same i musisz je zabijać?
W normalnych warunkach jak zabijesz proces rodzica to zabije również child procesy.

skrypt uruchamia kilka procesow ktore leca w tle i sprawdza czy sie powiodly jak nei to uruchamia je znowu, cos w stylu:


bash -c "until dupa; do logger \"dupa failed\"; sleep 1; done" &
bash -c "until dupa2; do logger \"dupa2 failed\"; sleep 1; done" &


czeka az bedzie timeout, nastepnie wykonuje troche roboty do ktorej niezbedne sa te procesy w tle, i zabija wszystkie smieci zeby nic z tych procesow nie pozostalo.

niestety cos w stylu kill -9 $$ nie dzialalo, i zabijalo skrypt ale reszta zostawala dalej w tle,

setsid robi nowa sesje procesow wiec kill -9 0 dziala fajnei bo zabija wszystko w tej sesji.

konto usunięte

Temat: [bash] zabic skrypt i wszystkie childy

Łukasz C.:

bash -c "until dupa; do logger \"dupa failed\"; sleep 1; done" &
bash -c "until dupa2; do logger \"dupa2 failed\"; sleep 1; done" &
Nie czaję. Po co sleep w pętli until skoro pętla until trwa tak długo aż spełniony zostanie warunek?
Nie wiem jak sprawdzasz czy logger zrobił swoje poprawnie i na jakiej podstawie zostaje przerwana pętla until.

Bez kawałka kodu to zgadywanki choć i tak bez celu skoro już wybrałeś rozwiązanie ;).

P.S. Perl Twoim przyjacielem ;)
Michał Panasiewicz

Michał Panasiewicz Administrator
systemów, sieci i
aplikacji.

Temat: [bash] zabic skrypt i wszystkie childy


PID=$$

for child in $(pstree -p $PID | sed 's/(/\n(/g' | grep '(' | sed 's/(\(.*\)).*/\1/')
do
kill $child
done



http://stackoverflow.com/questions/392022/best-way-to-...

konto usunięte

Temat: [bash] zabic skrypt i wszystkie childy

Arkadiusz Z.:
Łukasz C.:

bash -c "until dupa; do logger \"dupa failed\"; sleep 1; done" &
bash -c "until dupa2; do logger \"dupa2 failed\"; sleep 1; done" &
Nie czaję. Po co sleep w pętli until skoro pętla until trwa tak długo aż spełniony zostanie warunek?
Po to, żeby nie sprawdzać i nie logować -naście tysięcy razy na sekundę?
Nie wiem jak sprawdzasz czy logger zrobił swoje poprawnie i na jakiej podstawie zostaje przerwana pętla until.
W powyższym pseudokodzie warunkiem jest "dupa", a logger służy tylko do logowania, że ta dupa jest wciąż fałszywa.

A do autora wątku: możesz w swoim skrypcie "nadrzędnym" za każdym uruchomieniem dzieciaka zapamiętywać jego PID ($!) - na przykład dopisywać do jakiejś tablicy CHILDREN_PIDS, a potem przy wyjściu (czy "samoistnym", czy też "wymuszonym" - trap na INT TERM, czy co tam jeszcze obsługujesz) robić kill "${CHILDREN_PIDS[@]}" (wersja dla ostrożniejszych - najpierw sprawdzić, czy dany element tej tablicy jest naprawdę ciągle PID-em tego procesu, o którym myślimy, że jest :-) )

konto usunięte

Temat: [bash] zabic skrypt i wszystkie childy

Jakub J.:
Arkadiusz Z.:
Łukasz C.:

bash -c "until dupa; do logger \"dupa failed\"; sleep 1; done" &
bash -c "until dupa2; do logger \"dupa2 failed\"; sleep 1; done" &
Nie czaję. Po co sleep w pętli until skoro pętla until trwa tak długo aż spełniony zostanie warunek?
A, no i oczywiście zapomniałem dopisać - pętla until trwa tak długo, aż warunek *nie* będzie spełniony.

konto usunięte

Temat: [bash] zabic skrypt i wszystkie childy

Jakub J.:
W powyższym pseudokodzie warunkiem jest "dupa", a logger służy tylko do logowania, że ta dupa jest wciąż fałszywa.
Ok ale dupa to nadal nic. Jak nie wiem co jest warunkiem to mogę nad kodem zgadywać do bólu. Konstrukcja pętli zawsze jest zależna o testu sprawdzającego, a ten to dupa....
Łukasz C.

Łukasz C. Senior Technical
Architect

Temat: [bash] zabic skrypt i wszystkie childy

"dupa" to w moim przypadku sciezka do binarki i parametry, a ze owa binarka korzysta z wielu wynalazkow od pamieci wspoldzielonej, przez rozne biblioteki .so po serwer x wiec jest wieeele miejsc gdzie to moze dac ciala, dlatego w petli i ma sie restartowac jak bedzie crash ;)

a co do innych rozwiazan, dzieki za nie, obadam czy to dziala, choc na razie tandem kill -9 0 z setsid chula jak nalezy :)

konto usunięte

Temat: [bash] zabic skrypt i wszystkie childy

Arkadiusz Z.:
Jakub J.:
W powyższym pseudokodzie warunkiem jest "dupa", a logger służy tylko do logowania, że ta dupa jest wciąż fałszywa.
Ok ale dupa to nadal nic. Jak nie wiem co jest warunkiem to mogę nad kodem zgadywać do bólu. Konstrukcja pętli zawsze jest zależna o testu sprawdzającego, a ten to dupa....
Ale czymkolwiek ta dupa by nie była, to sleep 1 robi "nie wykonuj zawartości pętli częściej niż raz na sekundę". Co w zestawieniu z loggerem nasuwa oczywiste (dla mnie) wnioski :)
Michał Szeląg

Michał Szeląg Doświadczony
Programista, Team
Leader

Temat: [bash] zabic skrypt i wszystkie childy

no właśnie próbuję kill -9 1 i nic się nie dzieje.... killall -9 init też nie działa...
macie może sposób na uwalenie całego kompa momętalnie jednym poleconkiem?
Marcin M.

Marcin M. Senior
Infrastructure and
Operations
Specialist at
Nordea...

Temat: [bash] zabic skrypt i wszystkie childy

Michał Szeląg:
no właśnie próbuję kill -9 1 i nic się nie dzieje.... killall -9 init też nie działa...
macie może sposób na uwalenie całego kompa momętalnie jednym poleconkiem?


Jako root maszynę położyć możesz jednym poleceniem na kilka sposobów, np:
init 0, shutdown now, kill -9 -1
Michał Szeląg

Michał Szeląg Doświadczony
Programista, Team
Leader

Temat: [bash] zabic skrypt i wszystkie childy

Marcin Matuszewski:
Michał Szeląg:
no właśnie próbuję kill -9 1 i nic się nie dzieje.... killall -9 init też nie działa...
macie może sposób na uwalenie całego kompa momętalnie jednym poleconkiem?


Jako root maszynę położyć możesz jednym poleceniem na kilka sposobów, np:
init 0, shutdown now, kill -9 -1

Nie działa, da się tak, żeby był efekt kill -9 na wszystkich procesach?!

Następna dyskusja:

jako lamer bash mam pytanie




Wyślij zaproszenie do