我需要find与另一个程序在bash脚本中启动的进程的PID。 我使用sshpass来input密码,sshpass启动ssh客户端,并在客户端打开sshtunnel到服务器。 这里是例子:
start_tunnel.sh #!/bin/bash exec sshpass -p 'passw' ssh -D :port user@$server -o StrictHostKeyChecking=no -f -N exit
我用子subrocess.Popen
启动它subrocess.Popen
:
proc = subprocess.Popen('start_tunnel.sh')
脚本启动正常,它通常完成并返回0,我可以得到它的PID,但是有可能得到启动sshclient的PID?
默认情况下, proc.pid
将返回shell的PID(即父进程)。 你要找的是子进程的PID(sshpass)。
所以在subprocess.Popen
设置shell=False
。 文档在这里 。
直接从sshpass
调用sshpass
并传入shell=False
选项。 那么直接的孩子将成为sshpass
子sshpass
。 不需要壳包装。
使用subprocess.Popen
我只是简单地调用shell=false
选项。