场景: 需要从某一台中央管控机器ssh登录到其他机器,执行某个脚本(getinfo.sh)得到机器的相关信息。要求全部脚本实现,于是采用expect调用ssh。整个过程没有问题,问题在于所要执行的脚本getinfo.sh会执行另一个脚本a.sh,而a.sh比较耗时,所以整个过程会很耗时。现想减少执行时间。
debug: 鉴于a.sh比较耗时,于是用nohup调用a.sh到后台执行,可是发现ssh还是会等a.sh全部执行完才结束。可是交互登录对方机器,执行getinfo.sh,然后退出,很快。问题貌似在ssh的调用方式。于是查找ssh的参数,发现有一个参数 -t,解释是这样的:
-t 该参数通过指定一个伪终端迫使SecureShell客户端以交互模式工作,即使在给定命令的情况下也是如此。它被用于执行在远地主机上的基于屏幕的程序。
可是添加参数 -t 后发现,程序会很快执行完结束退出,可是根本就不执行a.sh了(进程里没有a.sh),这就很奇怪了,难道是getinfo.sh执行太快,nohup还没来得及起起来?在nohup 执行a.sh后加上sleep 1试试,问题解决,原来真是这个恶心的问题。
solution:
1. ssh -t -p $PORT $SERVER -l $LOGIN "sudo /bin/bash /tmp/getinfo.sh"
2. getinfo.sh中在a.sh后加上"sleep 1"
阅读(45046) | 评论(0) | 转发(0) |