[英]How to send a subprocess to the background & without using shell=True
我正在尝试编写Python脚本的一部分,以更改Linux下小型Web管理界面的MySQL根密码。 我遵循了有关更改root密码的MySQL官方文档,并提出了以下shell脚本,效果很好:
shopt -s xpg_echo
# stopping running MySQL server
invoke-rc.d mysql stop
# creating init file in a mysqld readable location
cat > /var/lib/mysql/mysql-init <<END
UPDATE mysql.user SET Password=PASSWORD('x123') WHERE User='root';
FLUSH PRIVILEGES;
END
# running mysqld_safe with init-file in the background
mysqld_safe --init-file=/var/lib/mysql/mysql-init &
sleep 5
# stopping mysql
invoke-rc.d mysql stop
# deleting the init file
rm /var/lib/mysql/mysql-init
# starting mysql
invoke-rc.d mysql start
有一部分,我必须启动mysqld_safe并让它运行几秒钟,然后使用invoke-rc.d很好地停止它。 在shell脚本中,我可以使用&
和解决它sleep 5
。
我的问题是,如果不使用shell = True ,我不知道如何在Python脚本中执行此操作。 我可以使用Popen和shlex.split(cmd)来完成所有其他部分,但&似乎既不通过shlex.split(cmd)也不通过shell = False。
这是命令行中&
的简单问题,还是我真的需要shell = True? 如果没有,我是否需要使用线程?
我可能会丢失一些东西,但是这样的东西会不会吗?
import time
import subprocess
p = subprocess.Popen(['mysqld_safe', '--init-file=/var/lib/mysql/mysql-init'])
time.sleep(5)
subprocess.call(['invoke-rc.d', 'mysql', 'stop'])
&
是外壳程序,因此,是的,如果要使用&
在后台运行命令,则需要外壳程序。 但是,您也可以完全在Python中执行此操作:
proc = subprocess.Popen(["mysqld_safe", "--init-file=/var/lib/mysql/mysql-init"])
time.sleep(5)
proc.kill()
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.