Estou escrevendo um teste de serviço linux como precursor de um projeto que estou desenvolvendo. Estou tentando entender como funciona e por que está falhando agora.
Meu objetivo atual é criar um serviço linux (Ubuntu especificamente no meu caso) que monitore um arquivo de texto, check.txt
, para alterações. O conteúdo atual deste arquivo é simplesmente a palavra "yes" na primeira linha (embora sem aspas). Eu quero que meu serviço mude a palavra "sim" para "não" e mude de volta para "não" se eu entrar e mudar para "sim" a qualquer momento. Isso é o que eu tenho até agora.
Meu arquivo de serviço: trial.service
[Service]
ExecStart=/home/jeremiahdgage/trial.sh
User=root
Group=root
Sei que usar root aqui não é a melhor prática, mas será necessário mais tarde, então estou deixando por enquanto.
Meu arquivo bash: trial.sh
#!/bin/bash
while true
do
line=$(head -n 1 filename)
if [ "$line" == "yes" ]
then
sudo sed -i 's/yes/no/g' /home/jeremiahdgage/check.txt
fi
echo changes made at $(date)
sleep 1
done
while true
significa que dura para sempre, line
é a primeira linha do meu documento. Eu verifico a primeira linha para ver se é "sim" e uso sed
para trocá-la por "não". Eu fecho meu if, ecoo o tempo e durmo por 1 ms antes de repetir o processo novamente.
No entanto, algo está errado porque meu serviço falha ao iniciar... Se eu verificar meu status com systemctl status trial.service
, ele diz que há um erro de "permissão negada" no Exec.
O que eu fiz errado?
Atualizar:
Service now starts but bash code does not work.
Parece que você está perdendo permissões de execução em seu script.
Você pode consertar isso com:
Esse é um caso em que mesmo executando como root não funcionará, o root pode ignorar as permissões, mas o arquivo em si precisa ser executável para ser executado.
(Executar como root significa que as permissões do próprio diretório inicial não importam na maioria dos casos, embora em alguns casos, como o diretório inicial montado por NFS ou talvez um módulo de segurança como AppArmor ou SELinux possa impedir que o root acesse o diretório inicial.)
Uma boa primeira etapa para solucionar esse problema é tentar executar esse script diretamente, não no systemd, a partir de um shell raiz. Se você fizesse isso, notaria que falharia pelo mesmo motivo:
Isso pode dizer que executá-lo como um serviço não é realmente o problema, já que você também o reproduz a partir do shell.