linux - 带有 & 符号的远程 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
杀死子进程的信号,我找到了两个证据来证明它不是。
- 我发现了这个问题,我尝试在远程服务器上运行它
11.160.48.88
$shopt|grep hup
huponexit off
SIGHUP
所以ssh退出时子进程不会收到
- 我尝试运行另一个命令来证明它
ssh 11.160.48.88 "wget https://raw.githubusercontent.com/mirror/wget/master/README -O - 2>&1 > wgetReadme&"
结果:文件可以正确下载到目标文件。
我的问题是为什么Command 2
不能按预期工作?
解决方案
因为 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 &'"
推荐阅读
- python-2.7 - 在python变量中读取和存储xml数据
- multithreading - 在混合应用程序 C++ /cli 中使用线程从托管类调用本机类中的本机函数
- node.js - 使用 Mongoose 和 graphql-yoga 实现分页
- python-3.x - SyntaxError: (unicode error) 'unicodeescape' codec can't decode bytes in position 292-293: truncated \UXXXXXXXX escape during import
- angular - 如何在角度 4 中使用两个相同的路径 ='' 路由应用程序
- react-native - 在本机反应中将样式设置为导航选项内的自定义组件
- youtube-api - 每个人都需要自己的 YouTube API v3 密钥吗?
- python - 解读 sklearns 的 GridSearchCV 最佳成绩
- c# - C# 构造函数重载无用的括号
- ios - 在 ios 中将应用程序置于前台