Python 如何将子流程发送到后台&;不使用shell=True
我正在尝试编写一个Python脚本的一部分,该脚本在Linux下为一个小型web管理界面更改根MySQL密码。我遵循了MySQL官方文档中关于更改根密码的内容,并提出了这个shell脚本,它可以很好地工作:Python 如何将子流程发送到后台&;不使用shell=True,python,multithreading,shell,process,subprocess,Python,Multithreading,Shell,Process,Subprocess,我正在尝试编写一个Python脚本的一部分,该脚本在Linux下为一个小型web管理界面更改根MySQL密码。我遵循了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/mys
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
shopt-s xpg\u echo
#停止运行MySQL服务器
调用rc.d mysql stop
#在mysqld可读位置创建init文件
cat>/var/lib/mysql/mysql init&
是一个shell,因此,如果您想在后台使用&
运行命令,您需要shell。但是,您也可以完全在Python中执行此操作:
proc = subprocess.Popen(["mysqld_safe", "--init-file=/var/lib/mysql/mysql-init"])
time.sleep(5)
proc.kill()
我可能错过了一些东西,但是像这样的工作不是吗
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'])
&
由shell解释,因此必须使用具有该语法的shell。但是,通过使用系统调用fork
、exec*
和setsid
,您可以在Python中复制该功能。但是,难道不可能把波本放在一个线程中吗?是的,你也可以使用线程。这取决于你所说的“背景”到底是什么意思。要生成一个完全分离的子进程,您需要使用这些系统调用(以及其他调用),但是对于一个短命的进程,线程应该可以。我只想在进程初始化时等待大约5秒钟,然后调用invoke rc.d mysql stop
停止它。背景只是一个想法,什么在bash脚本中工作得很好。顺便说一句,仔细看看,你怎么知道mysql_安全过程已经完成了?您如何知道它已成功退出?既然你的脚本在睡觉时被阻塞了,你为什么不能等待它呢?mysqld_safe一直在前台运行,所以Python被这个命令卡住了。这就是为什么我想使用线程,但shell更容易。有趣的是——我认为Popen不会出现这种情况。对于我尝试过的每个命令或脚本,Popen()都会立即返回,并且它启动的进程会继续运行。@zsero:Popen会立即返回。如果您的意思是python进程在执行其所有代码后继续运行;可能是。