ssh远程执行脚本后无返回的解决方法
今天遇见一件很诡异的事情. 使用ssh远程执行脚本,脚本执行完毕后ssh却并没有返回.
为了取数据库执行计划,我写了个取执行计划的脚本上传远程服务器,然后用ssh远程执行该脚本:
ssh mbinst1@10.8.252.12 ". ~/.profile;ksh /tmp/getDBSQLV10.sh"
脚本执行完毕后,ssh却不知为什么一直卡死,并没有返回。
一开始以为是脚本陷入死循环无法终止,然而登陆服务器用ps命令查询,发现脚本已经执行完毕
# 登陆服务器 ssh mbinst1@10.8.252.12 # 通过ps命令发现已经没有脚本进程了 $ ps -elf |grep get 200001 A mbinst1 25231554 54460722 0 60 20 886180480 256 f1000a02000e12b8 15:52:58 pts/1 0:00 grep get
但是ssh连接依然存在
$ ps -elf |grep ssh 40001 A mbinst1 48103636 25559542 0 60 20 a46bac480 1584 15:44:46 - 0:00 sshd: mbinst1@notty 240001 A root 62783664 2359730 0 60 20 e665ee480 1340 f1000e000ecd1cc8 15:52:48 - 0:00 sshd: mbinst1 [priv] 240001 A root 2359730 1835420 0 60 20 e72764480 1324 Aug 28 - 0:00 /usr/sbin/sshd 240001 A root 25559542 2359730 0 60 20 846e0c480 1228 f1000e005f718cc8 15:44:45 - 0:00 sshd: mbinst1 [priv] 200001 A mbinst1 49283456 54460722 0 60 20 a86420480 256 f1000a02000e12b8 15:56:59 pts/1 0:00 grep ssh 40001 A mbinst1 58458534 62783664 0 60 20 ec5a64480 1468 15:52:48 - 0:00 sshd: mbinst1@pts/1
从上面可以看出,一共存在两个ssh连接,其中 sshd: mbinst1@pts/1
就是当前正在操作的登陆会话,而 sshd: mbinst1@notty
为ssh远程执行命令的会话(这里@后面的是终端名,如果是本机登陆,则会显示为ttyN,如果是通过ssh远程登陆则会显示成pts/N,如果是通过sftp/scp/ssh远程执行命令创建的连接则会显示notty)
猜想,出现这种情况的原因是不是跟没有分配伪终端有关,抱着试一试的态度把命令改成
ssh -t mbinst1@10.8.252.12 ". ~/.profile;ksh /tmp/getDBSQLV10.sh"
强制让ssh分配伪终端,发现居然真的正常退出了。
目前还无法理解原理,只能推测是跟ksh有关,求各位大神解释。
PS: 服务器是AIX6.1的操作系统,客户端是Redhat6.7