如何防止 /etc/rc.local 运行两次?

如何防止 /etc/rc.local 运行两次?

这是我/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

最好的解决方案是找出脚本被调用两次的原因。是 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存在,脚本就会退出。否则,它会创建它并继续运行它。此解决方案可能会引发竞争,但可能足以解决您的问题。

相关内容