启动时运行的Shell脚本无法运行mysql

时间:2018-07-15 02:06:54

标签: python linux raspberry-pi

我有一个通过init.d在启动时执行的shell,以便在启动时运行python脚本:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          start.sh
# Required-Start:    $all
# Required-Stop:
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Prepare device
### END INIT INFO

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/bin

. /lib/init/vars.sh
. /lib/lsb/init-functions

sudo /usr/bin/python /dir/script.py &

exit

部分脚本从数据库中提取数据:

cmd = "mysql -h 127.0.0.1 -upi -pXXXX -e 'some SQL code"
Messages = subprocess.check_output(cmd, shell = True )

python脚本在启动时正确初始化,并在从控制台执行时端对端运行。但是,在启动过程中执行时,看起来mysql服务尚未完全正常运行: ERROR 2003 (HY000): Can't connect to MySQL server on '127.0.0.1' (111 "Connection refused")

如何确保直到mysql服务启动,shell才会运行?

1 个答案:

答案 0 :(得分:0)

由于它是在Raspberry Pi上运行的,因此我假设您正在使用systemd。您需要正确的依赖关系才能告诉systemd您的脚本需要MySQL才能运行。

来自https://serverfault.com/questions/482730/systemd-dependencies-and-boot-order#725684

  

After=dirsrv.target-将确保在dirsrv.target之后启动smb.service。

在这种情况下,您可能希望本周类似“ After = mysqld.target or whatever Raspbian's systemd”调用MySQL。


如果您使用的是SysV init,尽管它在Raspberry Pi上并不常见,请确保在MySQL之后启动init脚本。例如,如果MySQL是从/etc/init.d/rc2.d/S45mysql/etc/rc2.d/S45mysql启动的,则将脚本与名称S45mysql放置或符号链接到与S46query_mysql相同的目录中。通过以S46开头,它将在所有名称以S45开头的脚本完成之后运行。

如果您还有其他依赖项,请在最后一个依赖项之后为脚本编号。就是说,如果像我的示例中那样依赖S45mysql,而且还依赖S55httpdS86tomcat(所有这些都是伪造的示例),则脚本的名称或符号链接应开始S87或更高版本。