在Linux的“screen”中运行Python脚本导致“无法分配请求的地址”

0 投票
2 回答
1118 浏览
提问于 2025-04-18 11:20

我有一个脚本,用来在Ubuntu 12.04上启动一个模拟环境(就是ROS和水下模拟)。为了让这个模拟环境正常工作,它的某些部分需要通过TCP/IP来和环境进行通信。

当我在普通的终端里运行这个脚本时,模拟环境会正常启动。它也会绑定到一个之前定义好的IP地址,没有任何错误或警告。我可以毫无障碍地使用它。现在问题来了:我需要在一个分离的屏幕中启动这个模拟(因为有这样的要求)。我使用了

screen -d -m -S UWSim bash -c 'export $USER=~ ; ~/uwsim_ws/uwsim_starter.sh'

我需要设置一个叫USER的变量,但在分离的屏幕中这个变量默认是没有设置的,否则脚本找不到ROS的其他子脚本。在执行上面的命令后,在ROS启动的某个阶段,我遇到了以下错误:

...
Traceback (most recent call last):
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
socket.error: [Errno 99] Cannot assign requested address
...

由于这个错误,我的组件无法连接到模拟环境。正如我之前提到的:在普通终端中一切都运行得很好。我猜可能是缺少了一些export的设置。我已经把终端中的所有export和屏幕中的export进行了比较(这让我设置了USER变量),但还是没有成功。

2 个回答

0

我建议你把所有和shell相关的操作放在 uwsim_starter.sh 这个文件里,而不是在你的 screen 命令里面。这样一来,你的 screen 命令就会简单很多。

另外,export $USER 这个命令其实并不是用来设置 $USER 的!你应该使用

export USER=~ 

来代替。

还有,Cannot assign requested address 这个错误通常是因为服务器上已经有其他程序在同一个 ip:port 或者 *:port 上监听。请检查一下,使用

netstat -plnt | grep <port number of your application>

然后在LISTEN模式下查找其他程序。

0

结果发现,这个脚本试图绑定到一个没有分配给任何网络接口卡(NIC)的IP地址。当我在屏幕外启动这个脚本时,它会使用localhost(这本来是应该的),但在屏幕内启动时,它却使用了一个默认地址(我也不知道这个地址是从哪里来的)。无论如何,感谢大家的反馈。

撰写回答