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?
Respostas:
Além do que o TokyoMEWS encontrou por si ...
(o que não está completamente correto -
Type=forking
só será necessário se o script sair enquanto os filhos estiverem em execução )... outros possíveis problemas são:
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).
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]
).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.fonte
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 .
fonte