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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
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:
#!/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
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
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
[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
CMD [ "/usr/bin/transmission-daemon", "--config-dir", "/etc/transmission-daemon", "--foreground", "--log-debug" ]
albo wyślę SIGTERM będąc w kontenerze
pkill --signal SIGTERM trans
To aplikacja zamyka się w zalecany sposób
[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
Offline
Najpewniej źle używam polecenia trap ale dochodzę po woli do ściany :D
#!/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"
Offline
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
#!/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
Offline
Strony: 1