Files
dotfilesv2/fish/functions/servicectl.fish
2026-03-28 16:48:16 +00:00

152 lines
6.2 KiB
Fish
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
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 <start|stop|restart|status|enable|disable|activate> <service_name>"
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