function servicectl --description "Manage s6 services (systemd-style wrapper)" # --- CONFIGURATION --- # Папка, где лежат оригиналы скриптов сервисов set -l SV_DIR /etc/s6/sv # "Живая" папка, которую сканирует s6 прямо сейчас (обычно в tmpfs/RAM) set -l SCAN_DIR /run/service # ПАПКА ДЛЯ АВТОЗАГРУЗКИ (Persistent). # Сюда ставятся симлинки, чтобы сервис запускался после ребута. # В Void Linux это /var/service, в других может быть /etc/s6/enabled set -l PERM_DIR /var/service # Пути для поиска логов set -l LOG_SEARCH_PATHS /var/log /var/log/s6 # --------------------- set -l cmd $argv[1] set -l service $argv[2] if test -z "$cmd" echo "Usage: servicectl " return 1 end switch $cmd # --- УПРАВЛЕНИЕ СОСТОЯНИЕМ (ВКЛ/ВЫКЛ) --- case activate # Просто линкуем в SCAN_DIR (работает до перезагрузки) if not test -d $SV_DIR/$service echo "Error: Service '$service' does not exist in $SV_DIR." return 1 end if test -L $SCAN_DIR/$service; or test -d $SCAN_DIR/$service echo "Service '$service' is already active (linked in runtime)." else sudo ln -s $SV_DIR/$service $SCAN_DIR/$service echo "Service '$service' activated (runtime link created)." # Обычно s6 сам запускает сервис при появлении линка, но можно ускорить sudo s6-svscanctl -a $SCAN_DIR end case enable # Линкуем в PERM_DIR (для ребута) + активируем в рантайме if not test -d $SV_DIR/$service echo "Error: Service '$service' does not exist in $SV_DIR." return 1 end # 1. Создаем постоянный линк if test -L $PERM_DIR/$service; or test -d $PERM_DIR/$service echo "Service '$service' is already enabled for boot." else sudo ln -s $SV_DIR/$service $PERM_DIR/$service echo "Service '$service' enabled (boot link created in $PERM_DIR)." end # 2. Активируем прямо сейчас (если еще нет) if not test -d $SCAN_DIR/$service sudo ln -s $SV_DIR/$service $SCAN_DIR/$service sudo s6-svscanctl -a $SCAN_DIR echo "Service '$service' activated for current session." end case disable # Удаляем отовсюду # 1. Останавливаем и удаляем из runtime if test -d $SCAN_DIR/$service sudo s6-svc -d $SCAN_DIR/$service # Send Down signal sudo rm $SCAN_DIR/$service # Remove runtime link echo "Service '$service' deactivated (runtime link removed)." else echo "Service '$service' was not active in runtime." end # 2. Удаляем из автозагрузки if test -L $PERM_DIR/$service; or test -d $PERM_DIR/$service sudo rm $PERM_DIR/$service echo "Service '$service' disabled (boot link removed)." end # --- УПРАВЛЕНИЕ ПРОЦЕССОМ (UP/DOWN) --- case start if not test -d $SCAN_DIR/$service echo "Error: Service '$service' is not active (not linked in $SCAN_DIR)." echo "Hint: Run 'servicectl activate $service' or 'servicectl enable $service' first." return 1 end sudo s6-svc -u $SCAN_DIR/$service echo "Service '$service' started (up signal sent)." case stop if not test -d $SCAN_DIR/$service echo "Error: Service '$service' is not active." return 1 end sudo s6-svc -d $SCAN_DIR/$service echo "Service '$service' stopped (down signal sent)." case restart if not test -d $SCAN_DIR/$service echo "Error: Service '$service' is not active." return 1 end sudo s6-svc -r $SCAN_DIR/$service echo "Service '$service' restarted." case status if test -d $SCAN_DIR/$service echo "--- Service Status ($service) ---" sudo s6-svstat $SCAN_DIR/$service if test -d $SCAN_DIR/$service/log echo "--- Logger Status ---" sudo s6-svstat $SCAN_DIR/$service/log end set -l found_log 0 for path in $LOG_SEARCH_PATHS if test -f "$path/$service/current" echo "" echo "--- Last 10 log lines ---" # Попытка сконвертировать TAI64N время, если есть утилита if type -q s6-tai64nlocal sudo tail -n 10 "$path/$service/current" | s6-tai64nlocal else sudo tail -n 10 "$path/$service/current" end set found_log 1 break end end else echo "Status: Service '$service' is INACTIVE (not linked)." if test -L $PERM_DIR/$service echo " (But it IS enabled for boot in $PERM_DIR)" else echo " (Not enabled for boot)" end end case '*' echo "Unknown command: $cmd" echo "Available: start, stop, restart, status, enable, disable, activate" return 1 end end