Files
XC_VM/src/service
T
Divarion_D 8aff75f91b fix(fanout): keep run.sh executable so xc_fanout always starts
The keepalive supervisor bin/xc_fanout/run.sh was deployed without its exec bit (a mode-dropping sync left it 0644), so 'service' could not launch it -> xc_fanout never started -> every stream served the not-on-air clip. Three defences: (1) Makefile set_permissions ships run.sh (and console.php) as 0755 in the archive; (2) service launches it via 'bash run.sh' so a lost exec bit no longer breaks startup; (3) StartupCommand chmods it +x on boot as a backstop.
2026-08-23 22:12:45 +03:00

106 lines
3.4 KiB
Bash

#!/bin/sh
SCRIPT=/home/xc_vm
USER=$(whoami)
if [ "$USER" != "root" ]; then
echo "Please run as root!"
exit 0
fi
# Launch every XC_VM service. Does NOT block — shared by start (foreground) and
# restart (returns to the shell).
boot() {
echo 'Starting XC_VM...'
sudo chown -R xc_vm:xc_vm /sys/class/net
sudo chown -R xc_vm:xc_vm /home/xc_vm/content/streams
sudo chown -R xc_vm:xc_vm /home/xc_vm/tmp
if [ -f $SCRIPT/bin/redis/redis-server ]; then
sudo -u xc_vm $SCRIPT/bin/redis/redis-server $SCRIPT/bin/redis/redis.conf >/dev/null 2>/dev/null
fi
mkdir -p $SCRIPT/bin/xc_fanout/sockets
sudo chown -R xc_vm:xc_vm $SCRIPT/bin/xc_fanout 2>/dev/null
sudo -u xc_vm bash $SCRIPT/bin/xc_fanout/run.sh &
sudo -u xc_vm $SCRIPT/bin/nginx/sbin/nginx >/dev/null 2>/dev/null
sudo -u xc_vm $SCRIPT/bin/nginx_rtmp/sbin/nginx_rtmp >/dev/null 2>/dev/null
sudo -u xc_vm $SCRIPT/bin/daemons.sh
# startup runs as root by design (root crontab, embedded `status 1`);
# it delegates the cache builds to xc_vm itself.
sudo $SCRIPT/bin/php/bin/php $SCRIPT/console.php startup
sudo chown xc_vm:xc_vm $SCRIPT/config/config.enc 2>/dev/null
sudo -u xc_vm $SCRIPT/bin/php/bin/php $SCRIPT/console.php signals >/dev/null 2>/dev/null &
sudo -u xc_vm $SCRIPT/bin/php/bin/php $SCRIPT/console.php watchdog >/dev/null 2>/dev/null &
sudo -u xc_vm $SCRIPT/bin/php/bin/php $SCRIPT/console.php queue >/dev/null 2>/dev/null &
sudo -u xc_vm $SCRIPT/bin/php/bin/php $SCRIPT/console.php cache_handler >/dev/null 2>/dev/null &
sudo -u xc_vm $SCRIPT/bin/php/bin/php $SCRIPT/console.php fanout_sync >/dev/null 2>/dev/null &
}
# Foreground entry for systemd (Type=simple): boot, then stay alive so systemd
# keeps tracking the unit. Holds the terminal BY DESIGN — for a manual,
# non-blocking restart use `restart` (or `systemctl restart|reload xc_vm`).
start() {
pids=$(pgrep -u xc_vm nginx | wc -l)
if [ $pids != 0 ]; then
echo 'XC_VM is already running'
return 1
fi
boot
echo 'Running in foreground...'
sleep infinity
}
stop() {
echo 'Stopping XC_VM...'
# PHP-FPM masters daemonize out of systemd's cgroup (start-stop-daemon
# --daemonize + per-user sudo session), so a soft/cgroup stop can leave them —
# and their OPcache shared memory — alive. Kill EVERYTHING owned by xc_vm by
# UID, escalating to SIGKILL, so stop/restart truly recycles FPM and OPcache.
# Always returns 0 so systemd's ExecStop never "fails" (which would skip it).
pkill -u xc_vm 2>/dev/null || killall -u xc_vm 2>/dev/null || true
sleep 2
for _ in 1 2 3; do
pgrep -u xc_vm >/dev/null 2>&1 || break
pkill -9 -u xc_vm 2>/dev/null || killall -9 -u xc_vm 2>/dev/null || true
sleep 1
done
return 0
}
restart() {
# Hard-recycle every xc_vm process EXCEPT ffmpeg (keeps active transcodes/
# streams running) then boot fresh — reliably flushes OPcache. Returns to the
# shell; does NOT hold the console (boot, not the foreground start).
ps -U xc_vm | egrep -v "ffmpeg|PID" | awk '{print $1}' | xargs -r kill -9
boot
}
reload() {
pids=$(pgrep -u xc_vm nginx | wc -l)
if [ $pids = 0 ]; then
echo 'XC_VM is not running'
return 1
fi
echo 'Reloading XC_VM...'
sudo -u xc_vm $SCRIPT/bin/nginx/sbin/nginx -s reload
sudo -u xc_vm $SCRIPT/bin/nginx_rtmp/sbin/nginx_rtmp -s reload
}
case "$1" in
start)
start
;;
stop)
stop
;;
reload)
reload
;;
restart)
restart
;;
*)
echo "Usage: $0 {start|stop|restart|reload}"
esac
exit 0