这仍然是阻塞的:
ssh host nohup cmd
这仍然使连接保持打开状态:
ssh host nohup cmd &
答案1
尝试这个:
ssh host batch cmd
答案2
您的示例中将&
分离 ssh 命令,但不会分离远程程序。
这似乎有效:
ssh 远程主机'tail -f /var/log/syslog &'&
ssh remote-host 'tail -f /var/log/syslog > /dev/null &' &
第一个命令&
将分离远程主机的命令,第二个命令&
将分离 ssh 命令本身
在我的示例中,关闭连接后 tail 命令仍在运行。
编辑这似乎不起作用,因为tail
连接实际上关闭后不久就会退出。
STDOUT
这可能与以下事实有关:在连接关闭后,写入内容可能会引发管道损坏
编辑2将 tail 命令重定向到 /dev/null 时工作正常 ^_^
但要小心,不要写入 stderr / stdout,或将输出重定向到本地目标
答案3
这个问题显然由来已久(甚至比你的问题还要久!)。解决方案是重定向 stdout 和 stderr。教科书上的例子是这样的:
ssh server 'sleep 20 & exit'
它会挂起 20 秒。使用 bash 你可以将其重写为:
ssh server 'sleep 20 >/dev/null 2>&1 & exit'
这样就修复了这个问题。对于 tcsh,你可以使用类似下面的命令:
ssh server '(sleep 20 >/dev/null) >& /dev/null & exit'
参考
- 2001 年的一个错误报告https://bugzilla.mindrot.org/show_bug.cgi?id=52
- 我发现的讨论上述解决方案的原始网站http://www.gossamer-threads.com/lists/openssh/users/3434
答案4
下列操作有效:
ssh myhost " nohup ./r.sh & " & sleep 2 ; kill -9 $! && echo
(至少在您没有被提示输入密码的情况下)。如果您被提示输入密码,我看不出有什么简单的方法可以做到这一点。