我有一个通过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才会运行?
答案 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
,而且还依赖S55httpd
和S86tomcat
(所有这些都是伪造的示例),则脚本的名称或符号链接应开始S87
或更高版本。