在 linux "screen" 中运行 Python 脚本,这会导致"Cannot assign requested address"



我有一个shell脚本,在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。我已经将终端中的所有导出与屏幕中的导出进行了比较(这导致我设置了USER变量),没有任何成功。

我会在uwsim_starter.sh shell中执行任何与shell相关的操作,而不是在屏幕命令中。由于这一点,您的屏幕命令将更简单

那么export $USER不应该设置$USER为任何东西!使用

export USER=~ 

而不是

同样,不能分配请求的地址通常出现在另一个进程已经在同一服务器上以相同的ip:port或*:port侦听时。请使用

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

并以LISTEN模式

查找其他人

结果是,脚本试图绑定一个没有分配给任何网卡的IP地址。当我在屏幕外启动脚本时,它使用localhost(就像假设的那样),当在屏幕内启动脚本时,它使用一些默认地址(不知道这是从哪里来的)。无论如何,感谢大家的反馈

相关内容

最新更新