我正在尝试在远程计算机上进行一些工作,并在不终止工作的情况下断开连接。我已经尝试了nohup
和screen
,遗憾的是它没有成功。在我输入exit
注销后,我的工作也会立即终止。
我正在尝试在远程计算机上运行108次模拟。为此,我编写了一个名为batch.sh
的脚本,它运行一个模拟,直到所有108个完成。实际运行模拟的程序在5个不同的终端中启动5个程序(使用xterm -e
)。我使用:
batch.sh
nohup bash batch.sh &
只要我连接,一切正常。如果我断开然后重新连接以检查一切是否正常工作......没有快乐:(
我有什么警告吗?可能是因为我的程序在外部终端中启动了其他程序?
更新
如果我在启动脚本之前使用将-oForwardX11=no
添加到ssh
并取消设置DISPLAY
的建议,我会收到以下错误:
nohup: ignoring input and appending output to nohup.out
在nohup.out
我收到以下消息:
xterm Xt error: Can't open display:
xterm: DISPLAY is not set
答案 0 :(得分:0)
显然,您的脚本/程序正在尝试自行启动xterm
。目前,许多系统默认为其SSH客户端启用X11转发 - 因此{shell}会话中设置DISPLAY
变量,但断开连接后变为无效。因此,只要您连接到远程系统,xterm
进程就可以通过SSH连接访问本地计算机上的X服务器,但一旦连接被切断就会死掉。
我偶尔会遇到使用例如Java程序的相同问题。即使没有实际的图形窗口,Java AWT子系统也可以生成图像文件。如果没有可用的X服务器,您应首先查看您的程序是否会以某种方式进行调整。一种选择是使用-oForwardX11=no
选项禁用X11转发至ssh
:
$ ssh -oForwardX11=no user@server.host.name
您还可以在启动脚本之前尝试取消设置DISPLAY
环境变量,看看会发生什么。
但是,如果您的程序不加区分地启动xterm
个窗口,那么您必须将其设置为使用服务器上的输出文件 - 必要时通过修改它。作为一个额外的优势,您可以摆脱转发X连接所涉及的网络负载和时序开销。
如果您无法更改程序的工作方式而您实际上并不关心那些xterm
窗口中的输出,那么您可以尝试在远程系统上启动virtual framebuffer X server并让您的脚本使用适用于xterm
。