【发布时间】:2021-04-13 11:36:41
【问题描述】:
如何在用 bash 编写的自动化脚本中删除 ssh 会话? 我有一个在本地运行的脚本来触发远程机器上的脚本,而远程机器上的脚本将触发另一个在后台运行的脚本...... 我想在远程机器仍在运行后台脚本的同时删除会话,所以我使用 nohup。
我有一个本地脚本localScript如下
#!/bin/bash
echo "start remote trigger script..."
./trigger
trigger 脚本已在我的远程计算机上准备就绪,其中包含以下几行:
#!/bin/bash
echo "start script test..."
nohup ./test > output &
echo "start test script in background, exit..."
exit
test 脚本是一个基本的睡眠循环,仅用于测试...
#!/bin/bash
c=1
while [ "$c" -le 10 ]
do
echo "sleep 10 seconds, c=$c"
sleep 10s
c=$((c+1))
if [ "$c" -eq 10 ]
then
echo "max count reach, exit"
exit
fi
done
但是我发现 ssh 使会话保持活动状态(等待空闲 100 秒),我怎样才能删除会话?
我使用的命令是
sshpass -p XXXX ssh -o StrictHostKeyChecking=no user@IP 'bash -s' < localScript
【问题讨论】:
-
将
&替换为2>&1 &或2>/dev/null &。 -
还是不行.... :(
-
我相信当您调用
ssh来运行没有PTY 的远程命令时,远程sshd进程会在它为远程进程的标准输出创建的PIPE 上获得EOF 时关闭会话.换句话说,你得到这个是因为“test”脚本进程,或“bash -s”进程,或其他进程仍在运行,并且“bash -s”进程的标准输出有一个打开的文件描述符。除了脚本中的内容之外,您的 shell 启动文件(.bashrc 等)可能正在后台启动其他命令? -
我想不出更好的解决方案,所以我使用的是
timeout seconds ssh ...