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?


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 After=getty@tty1.service).

  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.


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
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.