![如何从expect中生成的进程中获取PID?](https://linux22.com/image/25611/%E5%A6%82%E4%BD%95%E4%BB%8Eexpect%E4%B8%AD%E7%94%9F%E6%88%90%E7%9A%84%E8%BF%9B%E7%A8%8B%E4%B8%AD%E8%8E%B7%E5%8F%96PID%EF%BC%9F.png)
示例:在 shell 脚本中,我使用以下命令打开 SSH 隧道:
/usr/bin/expect <<EOD
set timeout -1
spawn ssh -fNL localhost:1873:localhost:873 HOST
expect "*?assword:" { send "$SSHPASS\r"}
sleep 2
exit [exp_pid]
EOD
export SSH_PID=$?
echo $SSH_PID
现在 $SSH_PID 有一些数字,但它不是生成的 ssh 的 PID。我尝试了不同的方法,但没有成功。任何想法?
答案1
退出状态是 8 位整数(尽管大多数 shell(ksh93 是一个例外)会将其截断为 7 位,因为它们将第 8 位用于有信号的进程),因此仅当 pid 介于 0 和 127 之间时它才有效。从管道而不是退出状态:
SSH_PID=$(
expect <<EOD
...
spawn -noecho ssh ...
puts [exp_pid]
...
EOF
)