Como evitar que o /etc/rc.local seja executado duas vezes?

2

Aqui está o meu /etc/rc.local até agora:

#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

/path/to/script.sh &

exit 0

E isso é tudo.

O problema é que script.sh está sendo executado duas vezes na inicialização, de acordo com seu arquivo de log. A primeira execução é como deveria, mas a segunda gera um monte de mensagens de erro por causa de coisas já iniciadas, etc. Se eu executar o script manualmente, ele só funciona uma vez, então tenho certeza de que não está fazendo um loop interno.

Se eu alterar /etc/rc.local para isso:

date     >> /path/to/Debug.txt
runlevel >> /path/to/Debug.txt
#/path/to/script.sh &

então eu recebo isso em Debug.txt após uma reinicialização:

Fri Jan  6 15:56:42 CST 2017
N 2
Fri Jan  6 15:58:38 CST 2017
N 2
    
por AaronD 06.01.2017 / 22:00

1 resposta

0

A melhor solução é descobrir por que seu script está sendo chamado duas vezes. O rc.local está sendo chamado duas vezes ou o script está sendo iniciado de outro local? Você poderia tentar adicionar um pouco de log ao rc.local para ver se é de fato o que está sendo chamado duas vezes. Por exemplo,

date >/var/tmp/rc.local.log
/path/to/script.sh &

exit 0

Se você não conseguir rastrear por que seu script está sendo iniciado duas vezes, a outra opção é criar um arquivo de bloqueio para seu script. Isso deve entrar em um sistema de arquivos tmpfs, então ele desaparecerá na reinicialização. Adicione algo assim ao topo do seu script.

test -f /var/run/script.sh.pid && exit 0
echo $$ >/var/run/script.sh.pid

Dessa forma, se o /var/run/script.sh.pid existir, o script será encerrado. Caso contrário, ele cria e continua a executá-lo. Esta solução está sujeita a corridas, mas pode ser suficiente para contornar o problema.

    
por 06.01.2017 / 22:27