Skocz do zawartości

Bash: Wyłączenie Procesu W Tle


borzole

Rekomendowane odpowiedzi

Mam w skrypcie coś takiego:

 fun_abc
fun_demon &
fun_interfejs

czyli w trakcie działania skryptu jakaś jego część oddziela się i żyje własnym życiem. No i mam problem jak kontrolować jej działanie, a w szczególności ładnie zakończyć wysyłając sygnał inny niż "killall". Obecnie robię to tak, że moja funkcja demon komunikuje się z resztą przez istnienie jakiegoś pliku "semafora" lub jego zawartość, bo "export" zmiennych coś tu nie działa. Przy czym sprawdzanie następuje co parę sekund, więc reakcja jest opóźniona. W jednej z opcji zenity (ikonka w zasobniku, pasek postępu) można tak zrobić, że się otwiera nowy deskryptor pliku a zenity nasłuchuje i natychmiast reaguje. Przydała by się taka opcja "nasłuchiwania", ale nie widziałem tego nigdy w skrypcie bash. Pomysły? Czego szukać?

Odnośnik do komentarza
Udostępnij na innych stronach

screen w skrypcie? :huh: chyba jestem mocno nie w temacie.

 

Ciekawe, że monitor systemu z gnome widzi 2-3 procesy, ale echo $$ zwraca ciągle ten sam numer skryptu. Natomiast jak wyrzucę "killall" w takiej funkcji to mam inny numerek np.:

 [lucas@jedral ~]$ ./zdp.lab 
[main]::23347
[min_icon]::23347
[demonek]::23347
...
/usr/local/sbin/zdp.lab: line 1: 23360 Zakończony             min_icon

pokombinuję jeszcze z deskryptorem pliku, że może jakoś w pętli będzie nasłuchiwał, ale nie mam pomysłu :lammer:

Odnośnik do komentarza
Udostępnij na innych stronach

killall to program a nie sygnał. Domyślnie wysyła sygnał SIGTERM. Jeśli potrzebujesz inny wystarczy sprecysować (killall -s KILL - dla przykładu). Z tego co kojarzę, to SIGINT jest wywoływany przy naciśnięciu Ctrl+C. Może takiego sygnału chcesz użyć?

 

Dajesz więc:

killall -s SIGINT <nazwa_programu>

Jeśli potrzebujesz dokładny program (wg. PIDu) to robisz (wg. mana):

kill -s SIGINT <pid>

Odnośnik do komentarza
Udostępnij na innych stronach

  • 1 month later...

PID procesu, który właśnie przeszedł w tlo to po prostu $!

zenity --info --text "nie klikaj, zaraz mnie zabije" &
TLO=$!
sleep 3
kill -TERM $TLO
# lub 
# kill -s SIGTERM $TLO

ech, jak to jest, że to czego potrzebujemy pojawia się zawsze po czasie :)

 

[EDIT]

okazuje się, że komunikacja też jest w miarę możliwa dzięki mkfifo

Using Named Pipes (FIFOs) with Bash

Odnośnik do komentarza
Udostępnij na innych stronach

  • 2 months later...

Może to Ci się przyda:

[root@charon ~]# kill -l
1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL       5) SIGTRAP
6) SIGABRT      7) SIGBUS       8) SIGFPE       9) SIGKILL     10) SIGUSR1
11) SIGSEGV     12) SIGUSR2     13) SIGPIPE     14) SIGALRM     15) SIGTERM
16) SIGSTKFLT   17) SIGCHLD     18) SIGCONT     19) SIGSTOP     20) SIGTSTP
21) SIGTTIN     22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO       30) SIGPWR
31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1  36) SIGRTMIN+2  37) SIGRTMIN+3
38) SIGRTMIN+4  39) SIGRTMIN+5  40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8
43) SIGRTMIN+9  44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13 52) SIGRTMAX-12
53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9  56) SIGRTMAX-8  57) SIGRTMAX-7
58) SIGRTMAX-6  59) SIGRTMAX-5  60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2
63) SIGRTMAX-1  64) SIGRTMAX
[root@charon ~]#

 

 

Opcja nasłuchiwania:

trap ' clear; printf "\n\n\n\tNacisnieto CTRL-C\n\n\n" ' SIGINT

 

 

Przykład należy odpowiednio zmodyfikować.

 

 

M.

Odnośnik do komentarza
Udostępnij na innych stronach

Dzięki, już do tego dobrnąłem jakiś czas temu. Nadmienię tylko, że do sterowania można użyć sygnałów powyżej 35, czyli SIGRTMIN+n o czym wspomina man 7 signal

Właściwie to w tym wątku jest już wszystko co potrzeba do zrobienia skryptów typu klient-serwer, komunikujących się albo przez stały kanał (mkfifo), albo przechwytując sygnały przerwań.

Gites, tylko do czego to wykorzystać. ;)

 

[ EDIT ]

Przykład z sygnał+trap jest w tym wątku

Odnośnik do komentarza
Udostępnij na innych stronach

Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto

Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.

Zarejestruj nowe konto

Załóż nowe konto. To bardzo proste!

Zarejestruj się

Zaloguj się

Posiadasz już konto? Zaloguj się poniżej.

Zaloguj się
×
×
  • Dodaj nową pozycję...