首页 > 解决方案 > 带有 & 符号的远程 wget 命令未按预期运行

问题描述

以下是一些测试结果:

我在本地主机上运行命令,并尝试在远程主机上执行一些命令11.160.48.88

命令 1:

ssh 11.160.48.88 "wget https://raw.githubusercontent.com/mirror/wget/master/README -O wgetReadme"

预计:

文件可以下载并重命名为 wgetReadme

结果:

按预期工作

命令 2:

ssh 11.160.48.88 "wget https://raw.githubusercontent.com/mirror/wget/master/README -O wgetReadme&"

我只是&在命令末尾添加了,因为我希望这个命令在后台运行

结果:

远程服务器上的文件wgetReadme为空,我不知道为什么

命令 3:

为了测试是否Command 2可以在远程服务器上运行,我尝试直接在服务器上运行命令11.160.48.88

wget https://raw.githubusercontent.com/mirror/wget/master/README -O wgetReadme&"

结果:有一些wget传输消息打印到stdout,文件下载到wgetReadme。正确地工作。

命令 4:

我想弄清楚是否是SIGHUP杀死子进程的信号,我找到了两个证据来证明它不是。

  1. 我发现了这个问题,我尝试在远程服务器上运行它11.160.48.88
$shopt|grep hup
huponexit       off

SIGHUP所以ssh退出时子进程不会收到

  1. 我尝试运行另一个命令来证明它

ssh 11.160.48.88 "wget https://raw.githubusercontent.com/mirror/wget/master/README -O - 2>&1 > wgetReadme&"

结果:文件可以正确下载到目标文件。

我的问题是为什么Command 2不能按预期工作?

标签: linuxbashshellwget

解决方案


因为 ssh 中的后台作业可能会导致 shell 在注销时挂起,因为当两个或多个线程可以访问共享数据并且它们尝试同时更改它时发生竞争条件,您也可以通过重定向所有三个来解决问题I/O 流,例如> /dev/null 2>&1 &所以Nohup命令在您的情况下很有用,它是一个忽略 HUP(挂断)信号的POSIX 命令。按照惯例,HUP 信号是终端警告相关进程注销的方式。所以我按以下方式更改您的代码:

ssh -f 11.160.48.88 "sh -c 'nohup wget https://raw.githubusercontent.com/mirror/wget/master/README -O - > wgetReadme  2>&1 &'"

您可以在https://en.wikipedia.org/wiki/Nohup阅读更多内容


推荐阅读