Terminating SSH session executed by bash script
我有一个脚本可以在本地运行以远程启动服务器:
1 2 3 4 5 | #!/bin/bash ssh user@host.com <<EOF nohup /path/to/run.sh & EOF echo 'done' |
在运行nohup之后,它挂起。我必须按ctrl-c退出脚本。
我尝试在here文档的末尾添加一个显式的出口,并对ssh使用"-t"参数。两者都不起作用。如何使此脚本立即退出?
编辑:客户端是OSX 10.6,服务器是Ubuntu。
我认为问题在于,当您从ssh进入时,nohup不能重定向输出,只有当它认为nohup.out连接到终端时,它才会重定向到nohup.out,并且我,即使使用
解决方法可能是自己重定向输出,然后ssh客户机可以断开连接-它不等待流关闭。类似:
1 | nohup /path/to/run.sh > run.log & |
(在一个从OSX客户机连接到Ubuntu服务器的简单测试中,这对我很有用。)
问题可能是…
1 2 | ... ssh is respecting the POSIX standard when not closing the session if a process is still attached to the tty. |
因此,解决方案可能是将
1 | nohup /path/to/run.sh </dev/null & |
请参见:使用nohup时ssh挂起exit
另一种方法可能是使用
1 2 3 4 5 | man ssh | less -Ip 'multiple -t' ssh -t -t user@host.com <<EOF nohup /path/to/run.sh & EOF |
请参见:bash为ssh生成子shell并继续程序流
当调用
为避免出现此消息,请使用
如果向
另一方面,如果没有为
1 2 3 | - ssh user@host.com <<EOF + ssh -T user@host.com <<EOF + ssh user@host.com /bin/bash <<EOF |
通常情况下,只有当有命令期望stdin/stdout是终端(如
据我所知,将不分配伪tty的
1 2 3 4 5 6 7 8 9 10 | #!/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 |
最后需要添加一个