我自己在 Linux Mint 上工作,有具有 root ssh 访问权限的远程 Ubuntu VPS 服务器。我有服务器上的脚本使得数据处理时间较长(需要数小时或数天的处理)。
现在我可以在我的机器上打开控制台,通过 ssh 连接到 VPS 并运行脚本 - 我可以在控制台中实时看到脚本正在执行的操作(处理了多少数据、还剩下多少数据等等会在我的控制台屏幕上定期刷新) - 这有效。
我怎样才能做类似的事情,但是没有本地机器的依赖:
- 连接到服务器并运行脚本
- 断开连接并让服务器执行其长时间的处理工作,而我可以重新启动本地机器或关闭它而不会影响已启动的服务器脚本的执行。
- 可以稍后再次连接并查看进程的当前状态(与实时显示的数据相同),而无需中断进程。
答案1
我认为这screen
是您的理想解决方案。它的工作原理是 - 您连接到 VPS,输入screen
,然后运行脚本并从 shell 中分离(关闭终端窗口,或按 ,ctrl+a
然后按ctrl+d
)
您的脚本(和 shell)将继续在后台运行。您可以screen
通过键入 查看编号screen -ls
。要恢复会话并查看脚本的进度/结果,请使用 获取屏幕编号screen -ls
,然后使用 连接到该屏幕screen -r <screen number>
。就是这样。恢复后,您可以再次以相同的方式分离。
apt-get install screen
您可以在基于 Debian 的发行版和yum install screen
基于 RedHat 的发行版上安装屏幕。
答案2
您还可以在后台运行脚本并在需要时访问输出。我的测试脚本相当简单:
root@jump:~# cat test.sh
#!/bin/bash
for ((i=0; i<=99999; i+=1)); do
echo $i
sleep 1
done
它每秒只打印一个数字。若要在后台运行它,我将使用:
root@jump:~# at now
warning: commands will be executed using /bin/sh
at> /root/test.sh
at> <EOT>
注意:EOT 是用 Control&D 完成的。之后,让脚本运行,断开与服务器的连接。当您想要查看输出时,连接并找到进程的 PID:
root@jump:~# ps aux | grep test
root 6312 0.0 2.1 18048 2836 ? SN 13:08 0:00 /bin/bash /root/test.sh
并获取输出。将 6312 替换为您的进程的 PID:
root@jump:~# tail -f /proc/6312/fd/1
137
138
139
140
141
^C
fd/1 = stdout,fd/2 = stderr