Skip to content

Instantly share code, notes, and snippets.

@Jipok
Created December 6, 2024 19:30
Show Gist options
  • Save Jipok/5d17b18d107358c7273055607d409de3 to your computer and use it in GitHub Desktop.
Save Jipok/5d17b18d107358c7273055607d409de3 to your computer and use it in GitHub Desktop.
Automaticly create tmux service for runit for each linux user
#!/usr/bin/env bash
USERS_DIR="/home"
SERVICES_DIR="/etc/sv"
RUNIT_DIR="/var/service"
create_tmux_service() {
user="$1"
service_name="tmux-${user}"
service_dir="${SERVICES_DIR}/${service_name}"
# Проверяем, существует ли уже сервис
[ -d "$service_dir" ] && return
# Создаем директорию сервиса
mkdir -p "$service_dir"
# Создаем run-скрипт
cat > "$service_dir/run" <<EOF
#!/bin/sh
su - ${user} -c "tmuxp load -d tmuxp.yaml"
exec su - ${user} -c sh -c 'while tmux has-session -t 0; do sleep 7s; done'
EOF
chmod 755 "$service_dir/run"
# Активируем сервис
ln -s "$service_dir" "$RUNIT_DIR/"
echo "NEW $1"
}
remove_tmux_service() {
user="$1"
echo "DEL $1"
service_name="tmux-${user}"
# Останавливаем сервис если он запущен
[ -L "${RUNIT_DIR}/${service_name}" ] && sv down "${service_name}"
# Удаляем символическую ссылку
rm -f "${RUNIT_DIR}/${service_name}"
# Удаляем директорию сервиса
rm -rf "${SERVICES_DIR}/${service_name}"
}
# Удаляем сервисы несуществующих пользователей
for service in ${SERVICES_DIR}/tmux-*; do
[ -d "$service" ] || continue
user=${service#${SERVICES_DIR}/tmux-}
[ -d "${USERS_DIR}/${user}" ] || remove_tmux_service "$user"
done
# Создаем сервисы для существующих пользователей
for user_dir in ${USERS_DIR}/*; do
[ -d "$user_dir" ] || continue
user=$(basename "$user_dir")
create_tmux_service "$user"
done
# Мониторим изменения в директории с помощью inotifywait
inotifywait -m --format '%f' -e create,delete -e isdir "${USERS_DIR}" |
while read -r user; do
if [ -d "${USERS_DIR}/${user}" ]; then
# Директория создана
create_tmux_service "$user"
else
# Директория удалена
remove_tmux_service "$user"
fi
done
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment