繁体   English   中英

如何在不使用shell = True的情况下将子流程发送到后台

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM