Como iniciar um serviço systemd após o login do usuário e pará-lo antes do logout do usuário


10

Eu tenho uma máquina Fedora 23.

Eu tenho um script bash de sincronização de diretório / arquivo que sincroniza meu diretório local / home com um diretório remoto (em uma máquina NAS). Eu o executo manualmente, mas gostaria de criar um serviço systemd e torná-lo mais flexível, já que outras pessoas usam meu PC com suas próprias credenciais de usuário, gostaria de saber quando um usuário está logado e iniciar meu serviço posteriormente.

Existe algo que eu possa fazer no arquivo systemd do meu serviço ou terei que verificar isso no meu código no script?

Eu só preciso ter acesso a variáveis ​​de ambiente (como $ USER) e executá-lo como um serviço.

Minha principal fonte de documentação é este link https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/sect-Managing_Services_with_systemd-Unit_Files.html


Faz systemctl --usero trabalho em F23?
User1686

Acho que sim, retorna uma lista e uma mensagem 76 loaded units listed.
GeorgeKaf 9/02

Aqui está outra abordagem que pode funcionar para você: unix.stackexchange.com/a/109270/111707 Escreva um pequeno script Python do qual você inicia .bashrcno logon, em seguida, ouve o sinal de logout do Gnome e se desliga.
BNAI

@IanB Obrigado, vou testá-lo. Nunca é demais ter algo assim por perto.
21417 GeorgeKaf #

Respostas:


15

Use o systemd, que já inclui suporte para sessões do usuário; na verdade, você já deve depender dele (inconscientemente).

Crie o diretório de serviço

mkdir -p $HOME/.local/share/systemd/user

Crie editar um arquivo de serviço (vim, gedit, geany - o que você quiser)

vim $HOME/.local/share/systemd/user/my.service

Deve ser mais ou menos assim, se for um serviço permanente.

[Unit]
Description=My very own Service
[Service]
Type=simple
TimeoutStartSec=0
ExecStart=/path/to/start/script arguments
[Install]
WantedBy=default.target

Mas parece que você prefere acioná-lo uma vez e, em seguida, ser bom com ele; portanto, use uma configuração oneshot como esta:

[Service]
Type=oneshot
RemainAfterExit=true
StandardOutput=journal
ExecStart=/path/to/start/script arguments
ExecStop=/path/to/stop/script arguments
[Install]
WantedBy=default.target

Obviamente, isso pressupõe que seu script é executável, ou seja:

chmod a+x /path/to/start/script
chmod a+x /path/to/stop/script

Caso contrário, você precisará anexar o caminho ao respectivo intérprete:

ExecStart=/bin/bash /path/to/start/script arguments

Agora recarregue o systemd (e faça o login novamente para testar)

systemctl --user enable my.service # enables the service
systemctl --user # should display your new unit in the list
journalctl --user should show the log

Se você precisar de mais informações, consulte o Arch-Wiki, por exemplo. Esse tópico do askubuntu tem várias idéias, incluindo a minha.

Você pode estender o comportamento (se você é root) para outros usuários, definindo o serviço globalmente. Para fazer isso, você precisará criar o arquivo de serviço em / usr / share / systemd / user / não em $ HOME / .local / share / systemd / user .


1
oi, a resposta foi boa Mas só funcionará se o serviço for iniciado no primeiro login e parado na última sessão do usuário.
Anwar

4
Você precisa do sinalizador --user ao ativar o serviço. "systemctl --user enable my.service"
blushrt

0

Eu sei disso há alguns anos, mas a resposta da ansiedade me ajudou. Então, acho que ainda é relevante. Além disso, isso é mais um comentário, mas eu não tenho esse privilégio, então eu o publico como uma "resposta". A qualquer custo...

Executando o Linux Mint 19, não pude "ativar" o serviço quando o script estava localizado em '$ HOME / .local / share / systemd / user'. Tentar fazer isso sempre resultava em um erro. No entanto, eu poderia iniciá-lo muito bem no diretório '$ HOME / .local / share / systemd / user'. Depois de mover o script para '/ usr / share / systemd / user /', o systemd me permitiu habilitá-lo sem problemas.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.