You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
Sergey Marinkevich cb017d23e8 increase check interval 1 month ago
.gitignore refucktoring 1 month ago
Makefile refucktoring 1 month ago
README.md add help 1 month ago
config.ini increase check interval 1 month ago
main.py check that service already running 1 month ago
port-butler.service refucktoring 1 month ago

README.md

Service Butler - Quick Start Guide

This script is a "butler" for your services (especially game servers). It saves RAM and CPU by running them only when someone actually wants to connect.

Install

make install

It will place the binary and configs on it's place.

The next step is enable and start service:

systemctl enable port-butler
systemctl start port-butler

How it works

The butler follows a simple loop for each service you configure:

  1. Sleeping & Listening: It sits on your service's port, waiting. The real service is offline.
  2. Wake Up Call: As soon as someone tries to connect, the butler catches the attempt, tells them to hold on (by closing the connection), and immediately starts waking up the real service.
  3. Waking Up: It runs your start_command. After a short startup_delay_sec, it begins watching.
  4. Watching: It periodically runs your check_command to see if anyone is using the service. As long as people are active, it does nothing.
  5. Going to Sleep: Once the service has been empty for idle_limit_sec, the butler runs the stop_command and goes back to step 1.

If the script is restarted, it uses is_running_command to see if the service is already up, so it can jump straight to the "Watching" step without restarting it.

Configuration

See config.ini for example.

It placed to /etc/butler.ini during installation.

Each service gets its own section, like [minecraft]. Here are the options:

  • start_command The shell command to start your service. e.g., systemctl start minecraft.

  • stop_command The shell command to stop your service. e.g., systemctl stop minecraft.

  • is_running_command A command that checks if the service is already active. This is crucial for when the butler script restarts. It should exit with 0 if running, and non-zero otherwise. The systemctl is-active --quiet <service> command is perfect for this.

  • check_command The most important command. It checks if the service is being used. The butler only cares about the exit code: 0 means "active", anything else means "idle".

  • listen_port The public port of your service (e.g., 25565 for Minecraft). The butler will listen here when the service is down.

  • listen_host The IP to listen on. 0.0.0.0 is what you want 99% of the time, as it means "listen for connections from anywhere."

  • check_interval_sec How often (in seconds) to run the check_command while the service is up.

  • idle_limit_sec How long (in seconds) the service can be idle before the butler shuts it down.

  • startup_delay_sec A short pause (in seconds) after starting the service before the first activity check. This gives your server time to fully load.