2

Вот мой /etc/rc.local пока что:

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

И это все, что есть.

Проблема в том, что script.sh запускается дважды при запуске в соответствии с его лог-файлом. Первый запуск идет как положено, но второй выдает кучу сообщений об ошибках из-за того, что уже запущено и т.д. Если я запускаю скрипт вручную, он запускается только один раз, поэтому я уверен, что он не зацикливается внутри.


Если я изменю /etc/rc.local на это:

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

затем я получаю это в Debug.txt после одной перезагрузки:

Fri Jan  6 15:56:42 CST 2017
N 2
Fri Jan  6 15:58:38 CST 2017
N 2

1 ответ1

0

Лучшее решение - выяснить, почему ваш скрипт вызывается дважды. Rc.local вызывается дважды, или ваш скрипт запускается из другого места? Вы можете попробовать добавить некоторые записи в rc.local, чтобы увидеть, действительно ли это вызывается дважды. Например,

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

exit 0

Если вы не можете отследить, почему ваш скрипт запускается дважды, другой вариант - создать файл блокировки для вашего скрипта. Это должно войти в файловую систему tmpfs, поэтому оно исчезнет при перезагрузке. Добавьте что-то вроде этого в начало вашего скрипта.

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

Таким образом, если /var/run/script.sh.pid существует, скрипт завершается. В противном случае он создает его и продолжает его запускать. Это решение подвержено гонкам, но этого может быть достаточно, чтобы обойти вашу проблему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .