如何停止重启后自启动的ROS脚本及无法终止的监控脚本
解决Ubuntu 14.04虚拟机中监控脚本失控、服务器连接及ROS自启问题
先从最紧急的「无法终止监控脚本」问题入手:
一、强制终止不受控的监控脚本
你说Ctrl+C、Ctrl+Z都不管用,大概率是脚本没处理中断信号,或者进程被挂起无法响应常规信号。试试这两个方法:
方法1:通过VirtualBox控制台直接操作虚拟机
- 打开VirtualBox管理界面,找到你的Ubuntu虚拟机,点击「显示」打开虚拟机的终端窗口(虽然无GUI,但系统启动后会默认进入终端)。
- 先找到监控脚本的进程ID:
# 查找和Odie相关的进程(因为脚本里检测的是Odie) ps aux | grep Odie # 或者直接找bash进程,筛选出你的监控脚本 ps aux | grep bash - 找到对应的PID(进程号,通常是第二列数字),用强制杀死命令:
这里sudo kill -9 <PID>-9是发送SIGKILL信号,几乎所有进程都没法忽略这个信号,能强制终止。
方法2:强制重启虚拟机(万不得已时用)
如果连虚拟机终端都没法操作,直接在VirtualBox管理界面选中虚拟机,点击「重启」。等系统重启后,记得修改你的监控脚本,添加信号处理逻辑,避免下次再失控:
在脚本开头加上这一行,让脚本能响应Ctrl+C的中断信号:
trap "echo '脚本终止'; exit 0" INT TERM
这样以后按Ctrl+C就能正常停止脚本了。
二、解决MobaXterm无法连接虚拟机IP的问题
目标服务器(你的Ubuntu虚拟机)未运行,先确保虚拟机本身正常启动,然后检查这几点:
- 确认虚拟机网络设置:
在VirtualBox里,虚拟机的网络模式建议选「桥接适配器」(这样虚拟机会和你的主机在同一局域网,IP地址段一致),或者「NAT模式」(需要端口转发)。 - 获取虚拟机的正确IP:
在虚拟机终端里执行:
找到ifconfigeth0或者enp0s3这类网卡的inet addr,就是虚拟机的IP地址。 - 检查SSH服务是否运行:
Ubuntu 14.04默认没装SSH服务,先安装并启动:
要设置开机自启的话:sudo apt-get update && sudo apt-get install openssh-server sudo service ssh start
之后用MobaXterm输入刚才获取的IP,用虚拟机的用户名和密码就能连接了。sudo update-rc.d ssh defaults
三、停止重启后自动启动的ROS脚本
ROS脚本开机自启通常有这几个触发点,逐一排查:
1. 检查/etc/rc.local文件
这是最常见的开机启动脚本存放位置,打开看看:
sudo nano /etc/rc.local
如果里面有roslaunch、rosrun或者调用你ROS脚本的命令,把对应的行用#注释掉,保存退出即可。
2. 检查用户的.bashrc文件
如果ROS脚本是在用户登录时自动启动的,看看用户目录下的.bashrc:
nano ~/.bashrc
查找有没有ROS相关的启动命令,比如source /opt/ros/indigo/setup.bash之后跟着的roslaunch,注释掉对应的行,重启终端就生效了。
3. 检查Upstart服务(Ubuntu 14.04默认用Upstart)
如果ROS脚本是做成了Upstart服务,去/etc/init/目录下找相关的配置文件:
ls /etc/init | grep ros
找到对应的.conf文件后,先停止服务:
sudo stop <服务名>
然后禁用开机自启:
echo manual | sudo tee /etc/init/<服务名>.override
这样下次重启就不会自动启动了。
4. 临时停止运行中的ROS节点
如果只是想暂时停止,不用找启动源,可以先列出当前运行的ROS节点:
rosnode list
然后杀死对应的节点:
rosnode kill <节点名>
或者直接杀死所有ROS节点:
rosnode kill -a
内容的提问来源于stack exchange,提问作者McBooley
相关产品推荐
相关产品推荐

