Como ter serviços de usuário no Runit
11/11/2025
Por que fazer isso?
Ao contrário de simplesmente iniciar programas normalmente, tê-los como serviços nos dá a vantagem de poder supervisioná-los, pará-los ou reiniciá-los de forma independente, sem precisar reiniciar a sessão inteira.
Se for o seu caso, você provavelmente se interessa por ter serviços de usuário no Runit. Esses serviços funcionam de forma semelhante aos serviços do sistema, mas com o runsvdir rodando sob o usuário em vez do root.
Requisitos
Antes de começar, você precisa preparar a seguinte hierarquia de diretórios. Eles não precisam necessariamente estar nesse local, mas este guia assume que foram criados assim:
-> ls ~/.local/share/runit/
├── sv/
└── service/
Em sv/ os serviços serão definidos, enquanto em service/ ficarão os links simbólicos (serviços ativos).
Para criar rapidamente os diretórios, você pode usar este comando:
mkdir -p ~/.local/share/runit/{sv,service,log}
Serviços
Instalação
Os serviços de nível de usuário para o Runit podem ser encontrados em vários lugares.
No meu repositório do Codeberg, tenho alguns que eu mesmo uso.
Criação manual
Para criar um serviço, usarei como exemplo um serviço que inicia o pipewire.
A estrutura de um serviço deve ficar assim:
-> tree /home/itszariep/.local/share/runit/sv/pipewire
├── log
│ └── run
└── run
O arquivo run contém o comando que será executado. Por exemplo:
#!/bin/sh
exec pipewire 2>&1
Já o log/run especifica onde o log do serviço será armazenado:
#!/bin/sh
exec svlogd -tt ~/.local/share/runit/log/pipewire
Ter um log não é obrigatório, mas é recomendado para ajudar a identificar erros nos serviços.
Ativação
Depois de adicionar ou criar serviços em ~/.local/share/runit/sv/, você precisa ativá-los.
Para isso, basta criar um link simbólico:
ln -s ~/.local/share/runit/sv/pipewire ~/.local/share/runit/service/
Se você criou vários serviços, pode linkar todos com um único comando:
ln -s ~/.local/share/runit/sv/* ~/.local/share/runit/service/
Resultado
Supondo que haja vários serviços, a estrutura deve ficar parecida com esta:
-> tree /home/itszariep/.local/share/runit/
.
├── log
│ ├── mate-polkit
│ ├── pipewire
│ ├── pipewire-pulse
│ └── wireplumber
└── sv
├── mate-polkit
│ ├── log
│ │ └── run
│ └── run
├── pipewire
│ ├── log
│ │ └── run
│ └── run
├── pipewire-pulse
│ ├── log
│ │ └── run
│ └── run
└── wireplumber
├── log
│ └── run
└── run
16 directories, 10 files
Iniciando os serviços
Para iniciar o supervisor e os serviços, execute o seguinte comando:
runsvdir ~/.local/share/runit/service
Esse comando pode ser adicionado à inicialização automática do seu ambiente de desktop ou gerenciador de janelas.
Gerenciando os serviços
Você provavelmente se deparará com isto se tentar gerenciar os serviços da maneira usual:
-> sv status pipewire
fail: pipewire: can't change to service directory: No such file or directory
Isso acontece porque o sv procura nos caminhos padrão do sistema.
Então você precisa especificar o caminho completo:
sv status ~/.local/share/runit/service/pipewire
Você também pode usar um script como o do meu repositório do Codeberg, que funciona igual ao sv, mas se chama usv:
-> usv status pipewire
run: /home/itszariep/.local/share/runit/service/pipewire: (pid 1403) 2124s; run: log: (pid 1402) 2124s
Turnstile
O Turnstile nos permite ter serviços de usuário de forma semelhante, embora exija configuração adicional. Pode ser útil se seus serviços precisarem de acesso à sessão gráfica, por exemplo.
Pessoalmente, eu não usei o Turnstile, mas o guia do Void Linux pode ser um bom ponto de partida para os interessados.


