在ubuntu20.04上用shell配置开机自启动

一周学的shell,一周半学的ros,然后这个人给了一个实战和一个开机自启动的任务,头发都掉光了~~


实战练习
有一个文件夹,里面有一堆.png图片和.jpeg,怎么把他们分开,分别存放在两个文件夹里

代码如下

代码1.0

#! /bin/bash

find . -name "*.png" | xargs mv -t *demoPng/
find . -name "*.jpeg" | xargs mv -t *demoJpeg/

代码2.0

#! /bin/bash

cp demo/*.jpeg -a demo/*png demoJpeg
cp demo/*.jpg demoJpg

sudo chmod +x ./movefile.sh #给movefile权限

在这里插入图片描述其实这个不算难,看了看C站上的一些博客,可以很轻松解决。

补充知识点

shell脚本之find

是实时查找工具,通过遍历指定路径下的文件完成文件查找
工作方式:沿着文件层次结构向下遍历,匹配符合条件的文件,执行响应的操作
find [options] ... [查找条件] [处理动作]
查找路径:指定具体的目标路径,默认当前目录
查找条件:指定的查找标准,可以是文件名,大小,类型,权限等,默认为找出指定路径下的所有文件

根据文件名查找:

  • -name"文件名称":支持通配符查找
  • -iname"文件名称":不区分文件名大小写
# 匹配/home/dou目录下所有以.txt为结尾的文件
find /home/dou -name "*.txt" -print 

根据属主,属组查找

  • -user USERNAME:查找属主为指定用户的文件
  • -group GROUPNAME:查找属组为指定用户的文件
  • -uid USERID:查找属主为指定uid号的文件
  • -gid GroupID:查找属组为指定GID号的文件
  • -nouser:查找没有属主的文件
  • -nogroup:查找没有属组的文件
find . -type f -user doudou -print
# 打印出当前目录下doudou拥有的所有文件

根据文件类型查找

  • -type TYPE
  • f:普通文件
  • d:目录文件
  • l:符号链接文件
  • s:套接字文件
  • b:块设备文件
  • c:符号设备文件
  • p:管道文件
# 匹配当前目录下所有的目录文件
find . -type d -print

组合条件
与:-a
或:-o
非:-not,!

#匹配包含这两种文件类型的文件
find .\(-name "*.txt" -o "*pdf"\) -print  

根据文件大小进行查找

  • -size[+,-]num单位,常用单位有:K,M,G
  • num单位:显示的是大于num-1,小于等于num这个区间内的值
  • -num单位:显示的是大于0,小于num-1区间内的值
  • +num单位:大于num至无穷大区间内的所有取值
# 匹配当前目录下大于2k的文件
find . -type f -size +2k

根据文件时间进行查找

  • 访问时间(-atime):用户最近一次访问文件的时间
  • 修改时间(-mtime):文件内容最后一次被修改的时间
  • 变换时间(-ctime):文件元数据(例如权限和所有权)最后一次改变的时间
# 匹配打印最近7天内访问的所有文件
find . -type f -atime -7 -print
-amin :访问时间-分钟
-mmin :修改时间-分钟
-cmin :变化时间-分钟

根据目录的深度进行查找
-mindepth,-maxdepth选项来限制find命令遍历的目录深度
#列出当前目录下的所有以f开头的文件,即使有子目录,也不会被打印和遍历
find . -maxdepth 1 -name "f*" -print

处理动作
-print:默认处理动作,显示至屏幕
-ls:类似于对查找到的文件执行“ls -l”命令
-delete:删除查找到的文件
-fls /PATH/TO/SOMEFILE:查找到的所有文件的长格式信息保存至指定文件中

shell脚本之xargs

xargs是给命令传递参数的一个过滤器,也是组合多个命令的一个工具
xargs可以将管道或标准输入数据转换成命令行参数,也能够从文件的输出中读取数据
xargs也可以将单行或者多行文本输入转为其他格式(多行变单行,单行变多行)
xargs的默认命令是echo,这意味着通过管道传递给xargs的输入将会包含换行和空白,不过通过xargs的处理,换行和空白将被空格取代


格式:
somecommand | xargs -item command



-a file 从文件中读入作为sdtin
-e flag ,注意有的时候可能会是-E,flag必须是一个以空格分隔的标志,当xargs分析到含有flag这个标志的时候就停止。
-p 当每次执行一个argument的时候询问一次用户。
-n num 后面加次数,表示命令在执行的时候一次用的argument的个数,默认是用所有的。
-t 表示先打印命令,然后再执行。
-i 或者是-I,这得看linux支持了,将xargs的每项名称,一般是一行一行赋值给 {},可以用 {} 代替。
-r no-run-if-empty 当xargs的输入为空的时候则停止xargs,不用再去执行了。
-s num 命令行的最大字符数,指的是 xargs 后面那个命令的最大命令行字符数。
-L num 从标准输入一次读取 num 行送给 command 命令。
-l 同 -L。
-d delim 分隔符,默认的xargs分隔符是回车,argument的分隔符是空格,这里修改的是xargs的分隔符。
-x exit的意思,主要是配合-s使用。。
-P 修改最大的进程数,默认是1,为0时候为as many as it can ,这个例子我没有想到,应该平时都用不到的吧。



xargs cat命令参数
cat main.c | xargs //没加命令,默认为echo
xargs -i命令参数
ls *.c | xargs -i tar -zcvf 2.tgz {}
xargs sh -c命令参数
cat file.txt | xargs -i  sh -c ‘command {} | command2 {} && command3 {}

shell脚本之mv
shell 的 mv 命令为移动(moving)的意思,实际可分为文件间的移动,文件到目录的移动,目录到目录的移动。

格式:
mv [选项] 源文件或目录 目标文件或目录


命令功能:

1.视mv命令中第二个参数类型的不同(是目标文件还是目标目录),mv命令将文件重命名或将其移至一个新的目录中。

2.当第二个参数类型是文件时,mv命令完成文件重命名,此时,源文件只能有一个(也可以是源目录名),它将所给的源文件或目录重命名为给定的目标文件名。

3.当第二个参数是已存在的目录名称时,源文件或目录参数可以有多个,mv命令将各参数指定的源文件均移至目标目录中。

4.在跨文件系统移动文件时,mv先拷贝,再将原有文件删除,而链至该文件的链接也将丢失。



参数:
-b :若需覆盖文件,则覆盖前先行备份。

-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖;

-i :若目标文件 (destination) 已经存在时,就会询问是否覆盖!

-u :若目标文件已经存在,且 source 比较新,才会更新(update)

-t  : --target-directory=DIRECTORY move all SOURCE arguments into DIRECTORY,即指定mv的目标目录,该选项适用于移动多个源文件到一个目录的情况,此时目标目录在前,源文件在后。

开机自启动程序

开机自启动脚本1.0

大概是因为每次运行ros结点时都要打开好几个终端,所以下意识的,就想到了打开多个终端执行,可惜的是,这一版不仅不能开机自启动,就连最基本的运行都很难做到。而且,这个人还指出了这些脚本名字都很难听,于是开始第二版!

FYT2023.service

[Unit]

Description=...

[Service]

#寻找ros包
Environment=LD_LIBRARY_PATH=/opt/ros/noetic/share/cv_bridge:/opt/ros/noetic/share/image_transport:/opt/ros/noetic/share/fyt_msg:/opt/ros/noetic/share/roscpp:/opt/ros/noetic/share/sensor_msgs:/opt/ros/noetic/share/std_mags


#执行的目标脚本
ExecStart=/bin/FYT2023.sh
#异常中止后是否重启的选项:一直重启
Restart=always
Type=simple
#重启间隔,1s
RestartSec=1
#重启次数限制:无限制
StartLimitInterval=0

[Install]

WantedBy = multi-user.target

openrostest.sh

#!/bin/bash


shdir=$(pwd)/FYT2023.sh
shdir1=$(pwd)/openroscore.sh
shdir2=$(pwd)/openconfig.sh
shdir3=$(pwd)/openimg_catcher.sh
shdir4=$(pwd)/opentest_img_catcher.sh

shdir_tls=$(pwd)

echo "#!/bin/bash" > $shdir1
echo "cd ../" >> $shdir1
echo "source devel/setup.bash" >> $shdir1
echo "roscore" >> $shdir1

echo "#!/bin/bash" > $shdir2
echo "cd ../" >> $shdir2
echo "source devel/setup.bash" >> $shdir2
echo "rosrun config node" >> $shdir2

echo "#!/bin/bash" > $shdir3
echo "cd ../" >> $shdir3
echo "source devel/setup.bash" >> $shdir3
echo "rosrun img_catcher node" >> $shdir3

echo "#!/bin/bash" > $shdir4
echo "cd ../" >> $shdir4
echo "source devel/setup.bash" >> $shdir4
echo "rosrun test_img_catcher node" >> $shdir4

echo "#!/bin/bash" > $shdir
#echo "cd ../" >> $shdir
#echo "catkin_make --pkg fyt_msg" >> $shdir
#echo "catkin_make" >> $shdir
#echo "sleep 8s" >> $shdir
#echo "cd Tools" >> $shdir
echo '{' >> $shdir
echo "   gnome-terminal -- bash -c ""$shdir_tls/openroscore.sh;exec bash""" >> $shdir
echo '}&' >> $shdir
echo 'sleep 1s' >> $shdir
echo '{' >> $shdir
echo "   gnome-terminal -- bash -c ""$shdir_tls/openconfig.sh;exec bash""" >> $shdir
echo '}&' >> $shdir
echo 'sleep 1s' >> $shdir
echo '{' >> $shdir
echo "   gnome-terminal -- bash -c ""$shdir_tls/openimg_catcher.sh;exec bash""" >> $shdir
echo '}&' >> $shdir
echo 'sleep 1s' >> $shdir 
echo '{' >> $shdir
echo "   gnome-terminal -- bash -c ""$shdir_tls/opentest_img_catcher.sh;exec bash""" >> $shdir 
echo '}' >> $shdir
echo "cd $(pwd)" >> $shdir
echo "$(pwd)/FYT2023" >> $shdir


sudo chmod +x $(pwd)/openroscore.sh
sudo chmod +x $(pwd)/openconfig.sh
sudo chmod +x $(pwd)/openimg_catcher.sh
sudo chmod +x $(pwd)/opentest_img_catcher.sh

sudo cp ./FYT2023.service /etc/systemd/system/ #将服务文件FYT2021.service加入到系统服务文件夹中
sudo cp $shdir /bin/ #将FYT2021.sh复制到 /bin 文件夹中
sudo chmod +x /bin/FYT2023.sh #给bin中的FYT2021.sh赋予可执行权限
sudo chmod +x $(pwd)/FYT2023.sh #给bin中的FYT2021.sh赋予可执行权限
sudo systemctl daemon-reload #刷新系统服务列表
sudo systemctl enable FYT2023.service #启动系统服务

开机自启动脚本2.0

这一版又加了删除部署的脚本,基本可以部署成功,只是很奇怪,开机之后执行【rosnode list】查看运行结点的时候,显示链接不上master。想不出来,发给组长

FYT2023.service

[Unit]

Description=...

[Service]

#寻找OpenVINO中的OpenCV包
Environment=LD_LIBRARY_PATH=/opt/ros/noetic/share/cv_bridge:/opt/ros/noetic/share/image_transport:/opt/ros/noetic/share/fyt_msg:/opt/ros/noetic/share/roscpp:/opt/ros/noetic/share/sensor_msgs:/opt/ros/noetic/share/std_mags



#执行的目标脚本
ExecStart=/bin/FYT2023.sh
#异常中止后是否重启的选项:一直重启
Restart=always
Type=simple
#重启间隔,1s
RestartSec=1
#重启次数限制:无限制
StartLimitInterval=0

[Install]

WantedBy = multi-user.target

Deploy.sh

#!/bin/bash


shdir=$(pwd)/FYT2023.sh
shdir_tls=$(pwd)



echo "#!/bin/bash" > $shdir

echo "cd $shdir_tls/../" >> $shdir

echo "source devel/setup.bash" >> $shdir
echo "roscore &" >> $shdir
echo "sleep 8s" >> $shdir
echo "rosrun config node &" >> $shdir
echo "rosrun img_catcher node &" >> $shdir
echo "rosrun test_img_catcher node &" >> $shdir
echo "cd $(pwd)" >> $shdir
echo "$(pwd)/FYT2023" >> $shdir


sudo cp ./FYT2023.service /etc/systemd/system/ #将服务文件FYT2023.service加入到系统服务文件夹中
sudo cp $shdir /bin/ #将FYT2023.sh复制到 /bin 文件夹中
sudo chmod +x /bin/FYT2023.sh #给bin中的FYT2023.sh赋予可执行权限
sudo systemctl daemon-reload #刷新系统服务列表
sudo systemctl enable FYT2023.service #启动系统服务
sudo systemctl start FYT2023.service #启动系统服务

Undelpoy.sh

#!/bin/sh
sudo systemctl disable FYT2023.service
sudo rm /etc/systemd/system/FYT2023.service
sudo rm /bin/FYT2023.sh
开机自启动脚本3.0
组长想不出来,摆烂~
但还是有一个奇怪的解决方案,就是第三版

Deploy.sh

#!/bin/bash


shdir=$(pwd)/FYT2023.sh
shdir_tls=$(pwd)



echo "#!/bin/bash" > $shdir

echo "cd $shdir_tls/../" >> $shdir

echo "source devel/setup.bash" >> $shdir
echo "roscore &" >> $shdir
echo "sleep 8s" >> $shdir
echo "rosrun config node &" >> $shdir
echo "rosrun img_catcher node &" >> $shdir
echo "rosrun test_img_catcher node &" >> $shdir

echo "sleep 500000000s" >> $shdir

sudo cp ./FYT2023.service /etc/systemd/system/ #将服务文件FYT2023.service加入到系统服务文件夹中
sudo cp $shdir /bin/ #将FYT2023.sh复制到 /bin 文件夹中
sudo chmod +x /bin/FYT2023.sh #给bin中的FYT2023.sh赋予可执行权限
sudo systemctl daemon-reload #刷新系统服务列表
sudo systemctl enable FYT2023.service #启动系统服务
sudo systemctl start FYT2023.service #启动系统服务

Knode.sh

#!/bin/sh

rosnode list | xargs rosnode kill	

在这里插入图片描述

开机自启动脚本4.0

好不容易搞完了,组长说这一版不稳定,需要用ros的launch来启动多个结点,好吧我不会,但最后组长搞出来了,如下

组长的博客

Deploy.sh

#!/bin/bash


shdir=$(pwd)/FYT2023.sh
shdir_tls=$(pwd)


# 生成 FYT2023.sh 脚本
echo "#!/bin/bash" > $shdir
echo "cd $shdir_tls/../" >> $shdir
echo 'export ROS_HOME=`pwd`' >> $shdir
echo "source devel/setup.sh" >> $shdir
echo "roslaunch start.launch" >> $shdir





#将服务文件FYT2023.service加入到系统服务文件夹中
sudo cp ./FYT2023.service /etc/systemd/system/ 
#将FYT2023.sh复制到 /bin 文件夹中
sudo cp $shdir /bin/ 
#给bin中的FYT2023.sh赋予可执行权限
sudo chmod +x /bin/FYT2023.sh 
#给当前目录中的FYT2023.sh赋予可执行权限
sudo chmod +x $(pwd)/FYT2023.sh 
#刷新系统服务列表
sudo systemctl daemon-reload 
#启动系统服务
sudo systemctl enable FYT2023.service 

部署

cd Tools
sudo chmod +x Deploy.sh
sudo ./Deploy.sh

取消部署

sudo ./Undeploy.sh
另外,这些脚本文件都在Tools文件夹下面,但start.launch文件却在Tools文件夹外面

start.launch

<launch>

    <node pkg="config" type ="node" name="config" respawn="true"/>
    <node pkg="img_catcher" type ="node" name="img_catcher" respawn="true"/> 
    <node pkg="test_img_catcher" type ="node" name="test_img_catcher" respawn="true"/>
</launch>
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值