我需要找到以另一个程序在bash脚本中启动的进程的pid。我使用sshpass输入密码,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
开始:
proc = subprocess.Popen('start_tunnel.sh')
脚本启动很好,它通常完成并返回0,我可以得到它PID,但是有可能获得启动sshclient的PID吗?
答案 0 :(得分:1)
默认情况下,proc.pid
将返回shell的PID(即父进程)。您正在寻找的是子进程的PID(sshpass)。
所以在shell=False
中设置subprocess.Popen
。 Documentation is here
答案 1 :(得分:0)
直接从sshpass
致电Popen
,然后传递shell=False
选项。那么直接子将是sshpass
子进程。不需要shell包装器。
答案 2 :(得分:0)
使用subprocess.Popen
我只需调用shell=false
选项即可。