通过 ssh 在远程主机上启动后台作业会挂起调用脚本

通过 ssh 在远程主机上启动后台作业会挂起调用脚本

我有这个代码:

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 为我指明正确的方向!

相关内容