我有这个代码:
for i in $ipb $ipc $ipd; do
ssh -i ~/.ssh/'key' 'name'@${i} /bin/bash << EOF
nohup ${install_dir}/redis-stable/src/redis-server ${install_dir}/${port}/node.conf &
EOF
let "port++"
done
这应该在所有 3 个 IP 地址上启动 Redis 服务器。然而它目前只执行第一个命令(在 ipb 上)。注意:如果手动输入 nohup-ed 命令,一旦使用该命令启动 Redis 服务器,用户必须按 Enter 才能键入其他命令。这个问题与redis无关,但很可能来自于脚本的编写方式,所以我认为不需要了解redis。 ssh 也工作正常。
我必须更改什么才能使其运行所有 3 个命令(每个 ip 一个)?
感谢您抽出宝贵的时间,如果您需要更多信息,请随时指出。
答案1
解释
您向without指定了命令 ( /bin/bash
) ,因此远程端没有分配 tty。然后发生两件事:ssh
-t
nohup
不重定向标准流(如果有一个 tty 就可以了);SSH 服务器等待 eof在断开连接之前,本地
ssh
继续运行。当管道的写入端没有打开任何进程的文件描述符时,就会发生 eof,这通常仅在所有没有将其 stdout 重定向到其他内容的进程都消失时才会发生。
重定向标准流,例如你在回答中做了使 SSH 服务器提前断开连接。
答案2
发现问题,将其添加到 nohup 行的末尾(就在 & 之前)
> foo.out 2> foo.err < /dev/null
感谢@berndbausch 为我指明正确的方向!