Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2022-04-26 11:47:04

  urbinek - Dzban Naczelny

urbinek
Dzban Naczelny
Skąd: Sosnowiec
Zarejestrowany: 2009-10-01
Serwis

Poprawne przekazanie SIGTERM do subprocesu

tl;dr: jak poprawnie wykonać
SIGTERM -> skrypt.sh -> SIGTERM -> daemon


W jaki sposób mogę poprawnie przekazać kill signal do procesu uruchomionego w skrypcie?

Generalnie mam sobie taki skrypt, który odpala 2 daemony wewnątrz kontenera:

Kod:

#!/bin/bash

_term() {
  echo "Caught SIGTERM signal!"
  kill -TERM "$child" 2>/dev/null
}

trap _term SIGTERM

echo "Starting nxing proxy"
nginx

echo "Starting transmission daemon service"
runuser -u $(id -un 1000) -- /usr/bin/transmission-daemon --config-dir /etc/transmission-daemon --foreground --log-debug &

child=$!
wait "$child"

Oba procesy działają, tak jak powinny

Kod:

root@1019b86117e0:/# ps aux
USER         PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root           1  0.0  0.0   4360  1644 pts/0    Ss+  11:07   0:00 /bin/bash /init.sh
root           8  0.0  0.0  31400  1716 ?        Ss   11:07   0:00 nginx: master process nginx
www-data       9  0.0  0.0  32544  6468 ?        S    11:07   0:00 nginx: worker process
root          10  0.0  0.0   7020  2392 pts/0    S+   11:07   0:00 runuser -u urbinek -- /usr/bin/transmission-daemon --config-dir /etc/transmission-daemon --foreground --log-debug
urbinek       12  0.1  0.0 328800 10916 pts/0    Sl+  11:07   0:01 /usr/bin/transmission-daemon --config-dir /etc/transmission-daemon --foreground --log-debug
root          24  0.2  0.0   4624  2648 pts/1    Ss   11:18   0:00 bash
root          32  0.0  0.0   7060  1708 pts/1    R+   11:18   0:00 ps aux

W momencie gdy przekaże SIGTERM przez dockera do procesu

Kod:

docker container kill --signal=SIGTERM transmission_daemon.1.qjdwvhjq8copsyggndzl07p5q

Proces 1 jest ubijany ale proces transmission-daemon na którym mi zależy nie jest poprawnie zamknięty

Kod:

[2022-04-26 11:36:39.146] Banned IP address "10.0.0.2" tried to connect to us (peer-mgr.c:2164)
[2022-04-26 11:36:41.146] Banned IP address "10.0.0.2" tried to connect to us (peer-mgr.c:2164)
Caught SIGTERM signal!

Session terminated, killing shell...

W momencie gdy uruchamiałem kontener z bezpośrednim wywołaniem transmission

Kod:

CMD     [ "/usr/bin/transmission-daemon", "--config-dir", "/etc/transmission-daemon", "--foreground", "--log-debug" ]

albo wyślę SIGTERM będąc w kontenerze

Kod:

pkill --signal SIGTERM trans

To aplikacja zamyka się w zalecany sposób

Kod:

[2022-04-26 11:25:53.129] Saved "/etc/transmission-daemon/settings.json" (variant.c:1221)
[2022-04-26 11:25:53.129] LPD Uninitialising Local Peer Discovery (tr-lpd.c:434)
[2022-04-26 11:25:53.129] LPD Done uninitialising Local Peer Discovery (tr-lpd.c:445)
[2022-04-26 11:25:53.129] DHT Uninitializing DHT (tr-dht.c:433)
[2022-04-26 11:25:53.129] DHT Saving 300 (300 + 0) nodes (tr-dht.c:459)
[2022-04-26 11:25:53.129] Saved "/etc/transmission-daemon/dht.dat" (variant.c:1221)
[2022-04-26 11:25:53.129] DHT Done uninitializing DHT (tr-dht.c:493)
[2022-04-26 11:25:53.129] Port Forwarding Stopped (port-forwarding.c:196)
[2022-04-26 11:25:53.129] RPC Server Stopped listening on 0.0.0.0:8081 (rpc-server.c:857)
[2022-04-26 11:25:53.129] Closing libevent thread (trevent.c:271)
Closing transmission session... done.

Wiem, że mogę prawilnie rozbić kontener na serwis albo zabijać kontener z uzyciem exec ale zależy mi w sumie na rozwiązaniu czysto bashowym


A w wolnym czasie, robię noże :)
http://nginx.urbinek.eu/_photos/signature.png

Offline

 

#2  2022-04-26 15:04:11

  urbinek - Dzban Naczelny

urbinek
Dzban Naczelny
Skąd: Sosnowiec
Zarejestrowany: 2009-10-01
Serwis

Re: Poprawne przekazanie SIGTERM do subprocesu

Najpewniej źle używam polecenia trap ale dochodzę po woli do ściany :D

Kod:

#!/bin/bash

# this is catching runuser command
_term() {
  echo "Caught $1 signal! Killing $(ps h -p $chipd_pid -o command | cut -d' ' -f1)($chipd_pid)"
  kill -s "$1" "$chipd_pid"
}

trap '_term SIGTERM' SIGTERM
#trap 'pkill --signal SIGTERM trans' SIGTERM

echo "Startiong nxing proxy"
nginx

echo "Starting transmission daemon service..."
runuser -u $(id -un 1000) -- /usr/bin/transmission-daemon --config-dir /etc/transmission-daemon --foreground --log-debug &

chipd_pid="$!"
wait "$chipd_pid"

A w wolnym czasie, robię noże :)
http://nginx.urbinek.eu/_photos/signature.png

Offline

 

#3  2022-04-26 20:02:08

  urbinek - Dzban Naczelny

urbinek
Dzban Naczelny
Skąd: Sosnowiec
Zarejestrowany: 2009-10-01
Serwis

Re: Poprawne przekazanie SIGTERM do subprocesu

Tutaj znalazłem rozwiązaniem chociaż dość dziwne

http://veithen.io/2014/11/16/sigterm-propagation.html napisał(-a):

This works unless wait is interrupted by a signal, in which case it returns immediately with an exit status greater than 128 (actually 128 plus the numeric value of the signal, which is 15 for SIGTERM). One may want to use this information to distinguish between the two cases. However, this approach would be flawed because the exit status of the child process may itself be greater than 128 (In particular the default signal handler for SIGTERM causes the process to terminate with exit code 143). One solution for this problem is to call wait twice

Kod:

#!/bin/bash

trap 'pkill --signal SIGTERM trans' SIGTERM TERM INT

echo "Startiong nxing proxy"
nginx

echo "Starting transmission daemon service..."
runuser -u $(id -un 1000) -- /usr/bin/transmission-daemon --config-dir /etc/transmission-daemon --foreground --log-debug &

child_pid=$!
wait $child_pid
trap - SIGTERM TERM INT KILL
wait $child_pid

A w wolnym czasie, robię noże :)
http://nginx.urbinek.eu/_photos/signature.png

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)