- 先启动应用程序里面添加:
-t 为打开终端的标题,便于区分。
-x 后面的为要在打开的终端中执行的脚本,根据需要自己修改就行了。 最后的exec bash;是让打开的终端在执行完脚本后不关闭。
tip:需要像上面一样新建一个终端再运行否则只是后台运行你看不到终端打印的内容。
- touch一个sh文件后chmod文件权限。
sudo chmod 777 /home/jzi/devsh/gmh_test.sh
- sh文件里面写shell脚本。先source环境,然后循环里面启动roscore,再启动自己的launch节点。
#!/bin/bash
#source ws_livox/devel/setup.sh
source /opt/ros/melodic/setup.bash
source /home/jzi/ws_livox/devel/setup.bash
sleep 1s
echo "jzi" | sudo -S chmod 777 /dev/tty*
sleep 3
while true
do
echo `date`,"check status..."
pid_roscore=$(ps -ef | grep 'roscore' |grep -v 'grep'| awk '{print $2}')
pid_livox=$(ps -ef |grep 'livox_lidar.launch' |grep -v 'grep'| awk '{print $2}')
if [ ! -n "$pid_roscore" ] ; then
echo `date`,"roscore [start]"
gnome-terminal -- bash -c "roscore; exec bash"
sleep 5
else
echo `date`,"roscore [OK]"
fi
if [ ! -n "$pid_livox" ] ; then
echo `date`,"livox_lidar [start]"
gnome-terminal -- bash -c "roslaunch livox_ros_driver livox_lidar.launch; exec bash"
else
echo `date`,"livox_lidar [OK]"
fi
exec0=mqtt_bridge
pid0=`ps -ef | grep $exec0 | grep -v "grep"`
if [[ $pid0 == "" ]]
then
echo "mqtt_bridge run failed:" >> /home/jzi/restart_log.txt
date >> /home/jzi/restart_log.txt
gnome-terminal -x bash -c "roslaunch mqtt_bridge demo.launch;exec bash;"
sleep 15
fi
done
相关shell脚本简单总结:
- ps命令将某个进程显示出来
grep命令是查找
中间的|是管道命令 是指ps命令与grep同时执行
grep命令是查找,是一种强大的文本搜索工具,它能使用正则表达式搜索文本,并把匹配的行打印出来。
grep全称是Global Regular Expression Print,表示全局正则表达式版本,它的使用权限是所有用户。
以下这条命令是检查java 进程是否存在:ps -ef |grep java - !叹号,一般在shell脚本中表示取反
[]方括号,这个叫条件表达式,简易版的if - $2:表示第二个字段
print $2 : 打印第二个字段
awk ‘{print $2}’ $fileName : 一行一行的读取指定的文件, 以空格作为分隔符,打印第二个字段,也就是进程的PID - $是表示变量
- if-then-else语句:当if语句中的命令返回为0状态码则运行then后的命令,返回为非零状态码时,会执行else部分中的命令。