从 myhost.mydomain.com,我启动了一个 nc 侦听器。然后登录到另一台主机以启动 netcat 推送到我的主机:
nc -l 9999 > data.gz &
ssh repo.mydomain.com "cat /path/to/file.gz | nc myhost.mydomain.com 9999"
这两个命令是脚本的一部分。仅 32K 字节发送到主机,ssh 命令终止,nc 侦听器收到 EOF 并且也终止。
当我在 myhost.mydomain.com 上的命令行上运行 ssh 命令(即不作为脚本的一部分)时,会下载完整的文件。发生什么事了?
我认为您的脚本中还发生了其他事情导致了这种效果。例如,如果您也在后台运行第二个命令并终止脚本,则您的操作系统可能会在脚本清理期间终止后台命令。
还要查找
set -o pipebreak
,当其中一个命令返回 != 0 时,它会终止管道中的所有命令。
第二点,在我看来,这种方法过于复杂。尝试减少到
ssh repo.mydomain.com "cat /path/to/file.gz" > data.gz
(
ssh
将远程的标准输出与本地连接)。这样写就更清楚了:
ssh > data.gz repo.mydomain.com "cat /path/to/file.gz"
这样,你就可以摆脱
nc
。据我所知,nc
是同步的,因此第二次调用(发送数据)应该仅在所有数据发送并刷新后才返回。
我遇到了类似的问题,最后发现登录守护进程的配置被设置为在注销时终止所有进程。
您可以为 KillUserProcesses 进行系统守护进程登录配置(退出时),这会覆盖 nohup、disown a.s.o
该文件名为 /etc/systemd/logind.conf
# See logind.conf(5) for details.
[Login]
#NAutoVTs=6
#ReserveVT=6
KillUserProcesses=no
在我的情况下,KillUserProcesses - 选项默认设置为 yes。