systemd 'Executar script shell na inicialização como usuário diferente com ambiente de login' [fechado]

1

Problema: Eu quero um script de shell para executar a partir do ambiente de login de um usuário diferente na inicialização. Aqui está o meu arquivo .service:

[Unit]
Description=Weather Application Server

[Service]
Type=oneshot
User=weather
RemainAfterExit=yes
ExecStart=/usr/local/weather/startfeed
ExecStop=/usr/local/weather/stopfeed

[Install]
WantedBy=multi-user.target

Isso funciona na linha de comando (por exemplo, digitar 'systemctl start / stop weatherService'). No entanto ... quando eu reiniciar a máquina, recebo o seguinte erro via journalctl -se:

-- Subject: Unit weatherServer.service has begun start-up
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--
-- Unit weatherServer.service has begun starting up.
Jan 10 19:21:48 localhost.local.local systemd[1]: Started D-Bus System Message Bus.
Jan 10 19:21:48 localhost.local.local systemd[784]: Failed at step USER  spawning /usr/local/weather/startfeed: No such file or directory
-- Subject: Process /usr/local/weather/startfeed could not be executed
-- Defined-By: systemd
-- Support: http://lists.freedesktop.org/mailman/listinfo/systemd-devel
--

Eu sou um novato no sistema, mas eu pesquisei alto e baixo. Por que posso executar isso a partir da linha de comando via 'systemctl start / stop' e regular a partir da linha de comando, mas não a partir do boot?

FIXO !!!!

A SOLUÇÃO FOI ...

A configuração "Arquivo de unidade" na postagem original está correta. O sistema que está executando isso está usando um processo semelhante ao ActiveDirectory que não tinha sido iniciado completamente quando este estava sendo disparado. A solução que funcionou para nós foi adicionar um 'timer' (ou seja, um arquivo .timer). O arquivo weatherServer.timer abaixo é o que funcionou para nós:

[Unit]
Description=Weather Application Server Timer

[Timer]
OnBootSec=30

[Install]
WantedBy=multi-user.target

Espero que isso ajude alguém que também esteja passando por esse problema.

    
por TheStressMan 10.01.2017 / 21:35

1 resposta

2

Parece que seu script está tentando ser executado antes de o sistema de arquivos / usr / local / weather ser montado. O que você quer fazer é colocar em uma dependência ou duas para dizer ao systemd para esperar até que o sistema de arquivos seja montado antes da execução. Isso pode ser feito adicionando uma linha After= na seção [Unit] do seu arquivo de unidade. Por exemplo:

[Unit]
Description=Weather Application Server
After=network.target local-fs.target

Depois de fazer a alteração, você precisará executar systemctl daemon-reload ou apenas reiniciar para ver se isso resolve o problema.

    
por 10.01.2017 / 21:51

Tags