为什么 sshpass 之后的命令没有执行?我是否应该以某种方式发出信号表明 ssh 连接已终止?
#!/bin/bash
SCRIPT="cd /proj
./run_server &
sleep 2
./run_process2 &
sleep 3"
if [ "$#" -ne 1 ]; then
echo "Wrong number of arguments. usage: " $0 " name(or IP address)"
else
sshpass -p "aaaa" ssh -o StrictHostKeyChecking=no root@"$1" "${SCRIPT}"
echo "123" #< --------- This command is not executed
python ./commands.py
fi
答案1
SCRIPT="cd /proj
./run_server &
sleep 2
./run_process2 &
sleep 3"
...
sshpass -p "aaaa" ssh -o StrictHostKeyChecking=no root@"$1" "${SCRIPT}"
仅当远程 SSH 服务器在脚本中运行的命令的标准输出上看到文件结束条件时,ssh 会话才会关闭。如果您希望run_server
在run_process2
ssh 会话结束后继续运行,则必须确保这些进程没有保持脚本的标准输出打开。您可以通过将其标准输出重定向到其他地方来做到这一点:
SCRIPT="cd /proj
./run_server > /dev/null 2>/dev/null < /dev/null &
sleep 2
./run_process2 > /dev/null 2>/dev/null < /dev/null &
sleep 3"
为安全起见,这会重定向所有标准文件描述符。我相信 ssh 主要关注标准输出。