Systemd não pode iniciar o script?

9

Eu tenho um script BASH que eu quero executar na inicialização. Meu sistema está executando o systemd, então eu criei um arquivo .service com o que eu acho que é a informação necessária:

[Unit]
Description=My Script
After=network.target

[Service]
ExecStart=/home/myscript.sh

[Install]
WantedBy=multi-user.target

Eu usei o systemctl enable para 'registrá-lo' e reiniciado. Na inicialização, disseram-me que meu script seria executado, mas não consegui ver nenhuma das mensagens que o ECHO deveria exibir na tela nem gravou algo em um arquivo, de acordo com o que havia escrito no script. Além disso, ele não inicia o aplicativo que deveria iniciar.

O status Systemctl me diz que o script foi executado e encerrado com sucesso. Ainda assim, o script não tem efeito. Se eu executar o script a partir de um shell, ele funcionará perfeitamente.

Algum de vocês sabe qual poderia ser o meu problema?

TokyoMEWS
fonte
3
Aparentemente, se o seu script inicia outra coisa, ele precisa de "Type = bifurcação". Eu me sinto um pouco estúpido por não mexer nas configurações anteriores.
TokyoMEWS
11
+1 para resolvê-lo. Poste sua solução como resposta e aceite-a para ajudar outras pessoas com o mesmo problema.
terdon
11
@TokyoMEWS: Mais precisamente, se o script iniciar outra coisa e sair enquanto seus filhos estiverem em execução, ele precisará de "Type = bifurcação".
user1686

Respostas:

7

Além do que o TokyoMEWS encontrou por si ...

Aparentemente, se o seu script iniciar outra coisa, ele precisará de "Type = bifurcação"

(o que não está completamente correto - Type=forkingsó será necessário se o script sair enquanto os filhos estiverem em execução )

... outros possíveis problemas são:

  1. Estou supondo que por "exibição na tela" você quis dizer que o script simplesmente escreve algo no stdout. Isso não é exibido na tela durante a inicialização - em vez disso, tudo, desde o stdout de um serviço, é enviado ao diário (ou ao syslog, dependendo da versão do seu systemd).

  2. Se você fez realmente tentar escrever na tela (por exemplo, usando echo Hi >/dev/tty1), então é muito provável que a saída do script desaparece quando agetty limpa a tela antes de mostrar prompts de login. (Para evitar isso, você teria que pedir a unidade [email protected]).

  3. Para gravar algo em um arquivo, você precisa ter o sistema de arquivos montado como leitura e gravação. Para isso, After=local-fs.target pode ser necessário, caso contrário, a unidade poderá ser iniciada novamente muito cedo. Mas isso depende da configuração específica do sistema operacional.

user1686
fonte
1

Se o seu script também definir a cláusula ExecStop , você precisará definir " RemainAfterExit = yes" para evitar que o ExecStop seja chamado automaticamente após o ExecStart . Isso permitirá que seu serviço esteja no status " ativo " após a execução do comando ExecStart .

[Service]
ExecStart=/home/myscript.sh start
ExecStop=/home/myscript.sh stop
RemainAfterExit=yes
ibai
fonte