编辑1

编辑1

我正在运行以下 SSH 命令:

ssh "root@$ip" 'nohup sh -s' < ./do_sync &

do_sync我的目标是在远程主机上执行(shell 脚本)的内容。我这样做是因为,出于我不会详细讨论的原因,我无法将实际的脚本文件传输到该机器并在那里执行它。

不确定是否相关,但远程计算机实际上是 Android x86 设备。不过,我并没有在上面做任何与 Android 相关的事情。 Java VM 甚至没有运行。它只是 Linux 的 Android 版本,上面有一些 busybox 实用程序。它没有bash,而且sh它使用的似乎非常基本/旧。我不确定它是否完全符合 POSIX 标准。直到现在我才遇到了获得我想要的行为的问题,所以为了以防万一它与操作系统相关,我想提一下这个细节。

此命令有效,但该ssh进程在后台保持活动状态。我期望发生的是这样的:

  1. 在后台执行SSH命令,以便脚本立即返回。
  2. SSH 命令应该连接到主机,执行sh -s ...命令并立即返回。
  3. 步骤 1 中的 SSH 进程应该结束

有人可以帮助我获得这种行为吗?请注意,我执行所有这些操作的机器有 bash 和较新版本的 sh。但远程 SSH 主机没有 bash,只有非常旧版本的sh.不确定这是否重要,但我想无论如何我都会分享。

编辑1

我也尝试过这个,但行为是相同的:

cat ./do_sync | ssh "root@$ip" &

编辑:意识到这是无效的,因为我省略了该nohup部分,但这最终具有相同的阻止行为:

cat ./do_sync | ssh "root@$ip" "nohup sh -s"

编辑2

也尝试过这个,仍然阻止 SSH 连接断开:

commands="$(cat ./do_sync)"
ssh "root@$ip" "nohup sh -c $commands"

在这种情况下,由于某种原因sh -s根本不起作用。

答案1

nohup 的技巧有时是重定向所有三个标准流。这应该适合你:

cat ./do_sync | ssh root@ip "cat > /tmp/do_sync && chmod 777 /tmp/do_sync ;  nohup /tmp/do_sync 2>/dev/null >/dev/null </dev/null &"

但如果没有 的重定向nohup,它将阻塞。

答案2

另一种方法是

cat do_sync | ssh "root@ip" 'nohup sh -s'

我假设您看到的效果是因为您./do_sync在后台执行。只是看起来该进程仍然挂起。除非你真的看到一个开放的连接?

相关内容