icecast-2.4.4-alt2 (p11, x86_64; в LXC с systemd). 1. В пакете нет systemd-юнита, только /etc/rc.d/init.d/icecast. Юнит из systemd-sysv-generator (Type=forking, GuessMainPID=no, RemainAfterExit=yes): после `systemctl start icecast` служба «active (exited)», а процесс `icecast -b` вскоре исчезает (в журнале icecast — ни строки). Тот же init-скрипт, запущенный напрямую из shell, и `icecast -b -c /etc/icecast.xml` вручную работают. Обходной путь — свой юнит: Type=simple, ExecStartPre=/etc/chroot.d/icecast.all, ExecStart=/bin/icecast -c /etc/icecast.xml (без -b), ExecReload=/bin/kill -HUP $MAINPID. 2. Пакетный /etc/icecast.xml задаёт `<pidfile>/icecast.pid</pidfile>`, а init-скрипт ждёт PIDFILE=/var/run/icecast/icecast.pid. В итоге `service icecast restart`/`stop` не находят процесс и не останавливают его, новый запуск молча не стартует (порт занят) — работает старый процесс со старым конфигом. Файл /icecast.pid при этом создаётся в корне ФС. Предлагаю: добавить icecast.service (Type=simple, без -b) и согласовать pidfile в конфиге с /var/run/icecast/icecast.pid. Также: в Sisyphus x86_64 пакета icecast сейчас нет (есть только в p11/p10 и sisyphus_e2k/mipsel).
Воспроизведено на p11 icecast-2.4.4-alt2 (docker alt-test:p11, systemd PID 1): - юнит только сгенерированный systemd-sysv-generator из /etc/rc.d/init.d/icecast, своего icecast.service в пакете нет; - pidfile создаётся в корне ФС (/icecast.pid), /var/run/icecast/ нет; systemctl stop icecast: "Service icecast is not running", юнит inactive, но "Unit process ... (icecast) remains running after unit stopped"; systemctl restart: "Could not create listener socket on port 8000 ... Server startup failed" при "[ DONE ]" — работает старый процесс. Исправление: свой icecast.service (Type=simple, ExecStartPre=/etc/chroot.d/icecast.all, ExecStart без -b, ExecReload=kill -HUP $MAINPID) и согласованный pidfile/init-скрипт. Сначала в Sisyphus (пакет туда возвращается), затем тем же релизом в p11 и c11f1.
Дополнение: перечитать конфиг по HUP (systemctl reload) нельзя при <chroot>1</chroot>, который включён в пакетном /etc/icecast.xml. После перехода в chroot (/var/lib/icecast) icecast уже не видит /etc/icecast.xml. По HUP в error.log: WARN config failed to load external entity "/etc/icecast.xml" EROR event/event_config_read Parse error in reading /etc/icecast.xml EROR event/event_config_read Error parsing config, not replacing existing config Служба продолжает работать со старым конфигом, а systemctl reload (и service icecast reload) возвращает успех, так что ошибку легко не заметить. Предложение: - в юните не задавать ExecReload: изменения применяются только restart, источник переподключается за несколько секунд; - либо держать копию конфига внутри chroot (ExecStartPre копирует /etc/icecast.xml в /var/lib/icecast/etc/ и icecast запускается с ней) — тогда HUP работает. Проверено на icecast-2.4.4-alt2 (p11), x86_64.