Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何将子流程发送到后台&;不使用shell=True_Python_Multithreading_Shell_Process_Subprocess - Fatal编程技术网

Python 如何将子流程发送到后台&;不使用shell=True

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

我正在尝试编写一个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/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进程在执行其所有代码后继续运行;可能是。