我有一个脚本可以在本地远程启动服务器:
#!/bin/bash
ssh user@host.com <<EOF
nohup /path/to/run.sh &
EOF
echo 'done'
在运行nohup之后,它会挂起。我必须按ctrl-c来退出脚本。
我尝试在此处文档的结尾添加明确的退出,并使用ssh的"-t"参数。但两者都无效。我该如何使此脚本立即退出?
编辑:客户端是OSX 10.6,服务器是Ubuntu。
我有一个脚本可以在本地远程启动服务器:
#!/bin/bash
ssh user@host.com <<EOF
nohup /path/to/run.sh &
EOF
echo 'done'
nohup /path/to/run.sh > run.log &
csh
脚本中进行ssh连接,运行远程命令,并尝试将输出发送回csh
脚本中的变量。您认为这是可能的吗?我遇到了相同的错误:我正在执行ssh -t -t
并收到错误消息:Inappropriate IOCtl for device
。 - krb686... ssh is respecting the POSIX standard when not closing the session
if a process is still attached to the tty.
因此,解决方案可能是将 nohup
命令的 stdin
与 tty 分离:
nohup /path/to/run.sh </dev/null &
另一种方法是使用ssh -t -t
强制分配虚拟终端(即使 stdin
不是终端)。
man ssh | less -Ip 'multiple -t'
ssh -t -t user@host.com <<EOF
nohup /path/to/run.sh &
EOF
Pseudo-terminal will not be allocated because stdin is not a terminal.
为了避免这个消息,可以使用ssh
的-T
开关告诉远程主机不需要分配伪终端,或者明确指定一个命令(如/bin/sh
)让远程主机执行这里文档提供的命令。如果给ssh
指定了一个明确的命令,则默认情况下不会提供伪终端形式的登录shell,即在指定了命令时不会有正常的登录会话(参见man ssh
)。另一方面,如果没有为ssh
指定命令,则默认情况下会为远程主机创建一个伪tty,用于交互式登录会话。- ssh user@host.com <<EOF
+ ssh -T user@host.com <<EOF
+ ssh user@host.com /bin/bash <<EOF
top
或vim
)或者需要在ssh
客户端命令执行完毕后杀死远程shell及其子进程时(参见:ssh command unexpectedly continues on other system after ssh terminates),才应该使用ssh -t
或ssh -t -t
。ssh
命令和一个写入到远程主机的nohup.out
的nohup
命令的唯一方法是让nohup
命令在ssh
机制未创建的伪终端中执行。例如,可以使用script
命令来实现这一点,并避免tcgetattr:Inappropriate ioctl for device
消息的出现。#!/bin/bash
ssh localhost /bin/sh <<EOF
#0<&- script -q /dev/null nohup sleep 10 1>&- &
#0<&- script -q -c "nohup sh -c 'date; sleep 10 1>&- &'" /dev/null # Linux
0<&- script -q /dev/null nohup sh -c 'date; sleep 10 1>&- &' # FreeBSD, Mac OS X
cat nohup.out
exit 0
EOF
echo 'done'
exit 0
exit 0
。