Jak zapobiec dwukrotnemu uruchomieniu /etc/rc.local?

2

Oto moja /etc/rc.local jak dotąd:

#!/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

I to wszystko.

Problemem jest script.sh działa dwa razy przy starcie, zgodnie z jego plikiem dziennika. Pierwszy bieg przebiega tak, jak powinien, ale drugi wypuszcza kilka komunikatów o błędach z powodu rzeczy już rozpoczętych itp. Jeśli uruchomię skrypt ręcznie, to tylko raz, więc jestem pewien, że nie zapętla się wewnętrznie.


Jeśli się zmienię /etc/rc.local do tego:

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

potem to rozumiem Debug.txt po jednym ponownym uruchomieniu:

Fri Jan  6 15:56:42 CST 2017
N 2
Fri Jan  6 15:58:38 CST 2017
N 2
AaronD
źródło
Próbując zrozumieć, dlaczego tak się dzieje. This script is executed at the end of each multiuser runlevel. Jaki jest wynik runlevel dowództwo?
Kamil Maciorowski

Odpowiedzi:

0

Najlepszym rozwiązaniem jest sprawdzenie, dlaczego Twój skrypt jest dwukrotnie wywoływany. Czy rc.local jest wywoływany dwukrotnie lub czy Twój skrypt jest uruchamiany z innej lokalizacji? Możesz spróbować dodać trochę logowania do rc.local, aby sprawdzić, czy w rzeczywistości jest to coś, co jest wywoływane dwukrotnie. Na przykład,

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

exit 0

Jeśli nie możesz wyśledzić, dlaczego skrypt jest uruchamiany dwukrotnie, drugą opcją jest utworzenie pliku blokady dla skryptu. Powinno to iść do systemu plików tmpfs, aby zniknął po restarcie. Dodaj coś takiego na początku skryptu.

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

W ten sposób, jeśli /var/run/script.sh.pid istnieje, skrypt kończy działanie. W przeciwnym razie tworzy go i kontynuuje jego uruchamianie. To rozwiązanie podlega wyścigom, ale może wystarczyć do obejścia problemu.

virtex
źródło
Połączyłem twoje i @ KamilMaciorowskiego komentarze i dodałem to do pytania.
AaronD