我想使用ssh的ControlMasterfunction共享连接以提高速度。 我试图编写脚本,以便我可以启动/重新启动/停止与不同主机的多个连接。
我怎样才能确定是否有任何这些连接正在使用? 如果我在ssh会话打开的时候杀了它,它会被closures
我的重新启动脚本理想上看起来像(伪脚本) – 停止脚本将是等效的,没有底部的ssh命令:
for HOST in $HOST_LIST do MASTER_PID=`find_master_pid $HOST` if $MASTER_PID then if `find_child_pid` echo Connection to $HOST in use: not terminating else kill -SIGHUP $MASTER_PID fi ssh -TMNf $HOST
你可以简单地使用
ssh -o ControlPath=$socket -O check
对于你打开的每个套接字(如果你把它们放在一个单独的目录中,很容易)。
如果检查失败(连接不再活跃),则返回255,如果通过,则返回其他值。 您可能也需要指定主机名,但没有任何$套接字上的awk不会给你:)
我目前的做法是使用lsof来查找Unix套接字。 如果我知道ControlPath指定的目标文件名,我可以像这样search主进程:
function find_master_pid() { lsof -a -U -u $USER -c ssh | grep $CM_DIR/$RUSER@$HOST | sed 's/^ssh *//' | cut -d' ' -f1 | sort -u }
这将给我的PID (不幸的是,直接给lsof的unix套接字文件的文件名不起作用,否则我可以只是要求它输出与-f的pid ;因此sed和cut )
searchsubprocess比较棘手。 主进程为每个subprocess打开一个新的套接字,连接到标准文件。 subprocess包含一个简单标记为socket 。 但是,由lsof返回的inode比相应的主进程套接字less一个。 所以以下find连接到主进程的subprocess(这需要$MASTER_PID来检查)
function find_child_pid() { for CHILD_PID in `lsof -a -U -u $USER -c ssh | grep socket | sed 's/^ssh *//' | cut -d' ' -f1 | sort -u` do CHECK_PID=0 for NODE in `lsof -a -U -u $USER -p $CHILD_PID -F i | grep ^i | sed 's/i//'` do MASTER_NODE=$((NODE+1)) CHECK_PID=`lsof -a -U -u $USER -p $MASTER_PID | grep $MASTER_NODE | wc -l` [[ $CHECK_PID == 1 ]] && echo $CHILD_PID done done }