我有一个可以在本地运行以远程启动服务器的脚本:
#!/bin/bash
ssh user@host.com <<EOF
nohup /path/to/run.sh &
EOF
echo 'done'
运行nohup后,它会挂起。我必须按ctrl-c退出脚本。
我尝试在here doc的末尾添加一个显式退出,并为ssh使用“-t”参数。两者都不起作用。如何立即退出此脚本?
编辑:客户端是OSX 10.6,服务器是Ubuntu。
答案 0 :(得分:16)
我认为问题在于当你从ssh进来时nohup无法重定向输出,只有当它认为它连接到终端时它才会重定向到nohup.out,并且我的stdin覆盖你将会阻止它,甚至与-t
。
解决方法可能是自己重定向输出,然后ssh客户端可以断开连接 - 它不等待流关闭。类似的东西:
nohup /path/to/run.sh > run.log &
(这对我来说是一个从OS X客户端连接到Ubuntu服务器的简单测试。)
答案 1 :(得分:8)
问题可能是......
... ssh is respecting the POSIX standard when not closing the session
if a process is still attached to the tty.
因此,解决方案可能是从tty中分离stdin
nohup
命令:
nohup /path/to/run.sh </dev/null &
请参阅:SSH Hangs On Exit When Using nohup
另一种方法可能是使用ssh -t -t
来强制伪tty分配,即使stdin
不是终端。
man ssh | less -Ip 'multiple -t'
ssh -t -t user@host.com <<EOF
nohup /path/to/run.sh &
EOF
请参阅:BASH spawn subshell for SSH and continue with program flow
答案 2 :(得分:2)
在没有显式命令的情况下调用ssh
时,从here文档重定向远程主机的stdin会导致消息:Pseudo-terminal will not be allocated because stdin is not a terminal.
要避免此消息,请使用ssh
的{{1}}开关告诉远程主机不需要分配伪终端或明确指定命令(例如-T
)远程主机执行here文档提供的命令。
如果给/bin/sh
一个明确的命令,默认是以伪终端的形式提供否登录shell,i。即指定命令时将没有正常的登录会话(请参阅ssh
)。
另一方面,如果没有为man ssh
指定的命令,默认设置是为远程主机上的交互式登录会话创建伪tty。
ssh
作为规则,只有在存在期望stdin / stdout成为终端的命令时才应使用- ssh user@host.com <<EOF
+ ssh -T user@host.com <<EOF
+ ssh user@host.com /bin/bash <<EOF
甚至ssh -t
(例如ssh -t -t
或top
或者,如果在vim
客户端命令完成执行时有必要终止远程shell及其子进程(请参阅:ssh command unexpectedly continues on other system after ssh terminates)。
据我所知,唯一的方法是组合一个ssh
命令,该命令不分配伪tty和一个ssh
命令,该命令写入远程主机上的nohup
是让nohup.out
命令在nohup
机制创建的伪终端不中执行。例如,可以使用ssh
命令完成此操作,并且将避免script
消息。
tcgetattr: Inappropriate ioctl for device
答案 3 :(得分:1)
您最后需要添加exit 0
。