Как изящно убить демона передачи в контейнере докера?

872
lama02

Я пытаюсь докернизировать автономный демон передачи с помощью https. Поэтому я использую transmission-daemonи nginxпакеты, и докер основан на Alpine Linux.

Для запуска обеих программ я использую supervisor.

Все работает хорошо, но я хочу, чтобы docker container stopизящно убить мой контейнер. Итак, я настроил supervisorраспространение сигнала TERM на transmission-daemon.

Это хорошо работает, когда передача простаивает. Но если я остановлю контейнер, когда он загружает или делает что-то, он, к сожалению, не работает. Кажется, что сигнал полностью игнорируется, потому что даже после окончания загрузки он продолжает работать.

Я понятия не имею, почему. Может кто-то помочь мне, пожалуйста?

Вот моя конфигурация передачи супервизора:

[program:transmission] user=transmission command=/usr/bin/transmission-daemon -f stopsignal=TERM stopwaitsecs=60 stopasgroup=true killasgroup=true 

Я открыт для любых предложений.

1

2 ответа на вопрос

1
Xen2050

Из вики Transmission arch вики похоже на команды до концаtransmission-daemon :

killall transmission-daemon 

Или же

$ transmission-remote --exit 

Или из помощи Ubuntu:

transmission-remote -n 'transmission:transmission' -q 

Я думаю, что сигналы SIGTERM и TERM одинаковы, и по killallумолчанию отправляется SIGTERM, похоже, ваш супервизор должен работать ... после stopwaitsecs он тоже должен посылать сигнал KILL, поэтому, если он не отправляет права сигналы в нужное время ... Подтвердите в терминале, что TERM / SIGTERM прервет передачу. Если это не так, возможно, это ошибка.

Попробуйте добавить строку redirect_stderrили, stdout_logfileчтобы узнать, скажет ли она руководителю что-нибудь полезное

Спасибо за ваш ответ. `translation-remote --exit`, кажется, работает. Я провожу много тестов, и проблема та же, если я вручную отправляю сигнал на передачу при загрузке. Кажется, игнорируй это. Но я сделал тот же тест, основанный на образе Archlinux, и он отлично работает ... Передающая версия обоих дистрибутивов одинакова (2.92). Поэтому я думаю, что причина более сложна: возможно, разница в управлении сигналами между Alpine и Archlinux? Это выше моих навыков ... lama02 6 лет назад 0
Я не знаком с Alpine, но, должно быть, в этом и заключается разница, простой сигнал * должен * работать. Но если работает только `translation-remote --exit`, можно попробовать изучить его исходный код, чтобы увидеть, что именно` --exit` делает, это не скрипт, поэтому он не так прост, как `less $ (который ...) `к сожалению, но тогда это не помогло бы супервизору, оно настроено так, чтобы легко использовать сигналы ... Я больше склоняюсь к ошибке в передаче Alpine Xen2050 6 лет назад 1
`translation-remote --exit` вызывает` tr_sessionClose` и чисто закрывает передачу. Я не понимаю, как сигналы TERM или INT также вызывают эту функцию, но я думаю, что это так, потому что, когда она работает на моих тестах, я вижу те же журналы, что и вызов tr_sessionClose`. Итак, вы думаете, что это может быть ошибкой в ​​трансмиссии Alpine? Но на Archlinux и Alpine есть одинаковые версии, так как это возможно? lama02 6 лет назад 0
Я никогда не слышал о Alpine linux до сегодняшнего дня, но, очевидно, он основан на busybox & musl (библиотека C), а не на glibc (репозиторий Debian называет glibc6 «стандартными библиотеками, которые используются почти всеми программами в системе»), так что может быть что-то. Вы могли бы попробовать сравнить исходный код из пакетов arch & Alpine? Или можете попробовать метод их вики http://wiki.alpinelinux.org/wiki/Setting_up_Transmission_(bittorrent)_with_Clutch_WebUI, управляющий им по HTTP («демон-трансмиссия будет управляться через Clutch, который запускается lighttpd») Xen2050 6 лет назад 1
Хорошо спасибо. В Alpine Linux явно есть проблема с передачей. Я выполнил следующий тест на Arch и Alpine в интерактивной оболочке: запустив демона передачи на переднем плане, добавив торрент через веб-интерфейс, отправив сигнал INT (Ctrl + C). На Alpine: ошибка сегмента или несколько сигналов игнорируются (я должен отправить -9, чтобы убить его). На Archlinux: он работает отлично, передача делает все это и чисто останавливается. lama02 6 лет назад 0
Это похоже на ошибку и действует как ошибка, особенно протестированная с той же версией в другой системе, я думаю, что это ошибка :) Это преимущество больших дистрибутивов, таких как Debian (и непосредственно полученных), большего количества тестировщиков и глаз, чтобы найти ошибки. Спасибо за проверку, я тоже опубликовал ваш отчет об ошибке, поскольку это определенно полезный ответ. Удачи! Xen2050 6 лет назад 1
Конечно, для больших дистрибутивов, но Alpine отлично подходит для докеров. Я новичок в докере и Alpine, я всегда использовал Archlinux раньше. Итак, я надеюсь, что кто-то исправит ошибку, иначе я сделаю свои контейнеры на основе Arch. Спасибо за стрелку вверх и вашу помощь, я тоже стрелка вверх. lama02 6 лет назад 0
1
lama02

Это, наверное, ошибка. Сообщается в Альпийском трекере ошибок:

https://bugs.alpinelinux.org/issues/8218

Похожие вопросы