![SSH 注销后保持进程活动](https://linux22.com/image/1322572/SSH%20%E6%B3%A8%E9%94%80%E5%90%8E%E4%BF%9D%E6%8C%81%E8%BF%9B%E7%A8%8B%E6%B4%BB%E5%8A%A8.png)
我正在尝试测量无线 802.11s 网状连接上两台计算机之间的带宽、数据包丢失、延迟和抖动。
我正在尝试编写一个(我的第一个) bash 脚本,它可以执行以下操作:
- 通过 SSH 连接到另一台计算机并开始从服务记录数据(
ptpd
、tcpdump
、iperf
)。 - 在自己的计算机上启动相同的进程并开始记录数据。
- 一旦
iperf
我自己的计算机上的传输完成,它应该通过 SSH 进入远程计算机并终止服务。
这个想法是,这三个步骤在 for 循环中运行,每次迭代都会增加 iperf 传输的包大小并记录结果数据。
我知道如何通过 在远程电脑上启动一个进程ssh host@adress process
。
但是,我不知道如何通过 SSH 启动多个进程并注销,因为一旦我注销,进程就会终止。我查看了screen
和nohup
命令,但不知道如何在脚本中使用它们。
提前致谢!
编辑:
感谢您迄今为止提供的所有帮助。
我现在让 nohup 工作了,正如人们指出的那样,它非常简单。所以现在我ssh host@adress nohup ./script.sh > /dev/null 2>&1 &
在主 PC 上的脚本中得到了:。这可以很好地在远程 PC 上启动一个脚本,然后注销 SSH。下一个问题是如何以 sudo 身份在远程 PC 上执行脚本,因为这是 tcpdump 所需要的。
尝试ssh host@adress **sudo** nohup ./script.sh > /dev/null 2>&1 &
沒有效果。
有任何想法吗?
编辑2:
如果有人遇到同样的问题,我找到了解决此问题的指南:
http://www.pantz.org/software/ssh/using_ssh_and_sudo_instead_of_root_for_remote_commands.html
答案1
使用screen
。
一些有用的快捷方式:
- ctrl+a+c:创建一个新的“窗口”
- ctrl+a+n:转到下一个“窗口”
- ctrl+a+p:转到上一个“窗口”
- ctrl+a+d:分离会话(它继续运行)
分离后,使用screen -r
恢复会话。screen -x
如果屏幕会话未分离,但以其他方式进入后台(或实际上仍在另一个终端上运行),也有此情况。
2021 年编辑:考虑tmux
以及作为的更好替代方案screen
。
或者,对于单个过程,nohup
—如其他答案中提到的那样。
答案2
从 a--help
开始nohup
;
Usage: nohup COMMAND [ARG]...
or: nohup OPTION
Run COMMAND, ignoring hangup signals.
只需在命令&
中添加一个nohup <whatever you want to run>
。这意味着除非您专门终止生成的nohup
进程,否则它永远不会消失。
您可以使用screen
或完全跳过 nohup,我听说即使与远程主机的连接断开,它也会保持进程运行(这是它的一个相当了不起的优势)。不过,我不知道如何做到这一点,所以您需要在下载后执行/tmux
来自己阅读。man screen
man tmux
答案3
您可以在程序前面加上nohup
。
例如nohup myprogram &
。这将启动程序并将所有输出发送到名为 nohup.out 的文件。它还会在您注销时捕获 sigHUP。
另一个解决方案是运行screen
或tmux
答案4
答案就在你的问题里。使用screen
或nohup
命令。你对如何使用它们有什么不明白的?
尝试
ssh host@address nohup command args &
。& 将ssh
shell 置于本地系统的后台,这意味着隧道ssh
将尽可能长时间地保持。但是,如果本地进程因任何原因终止或失去与远程主机的连接,该nohup
命令将阻止command
远程系统上的运行终止。ssh