Ubuntu mate自启脚本/命令总共有三种方法,分别是/etc/init.d方法、/gnome-terminal方法、rc.local方法
下面一一介绍,并展示使用结果。
我是用的是树莓派4B,安装的系统是ubuntu mate 20.04 desktop
先简单介绍一下这个文件,参考/etc/init.d是个什么文件夹:
/etc/init.d是指向/etc/rc.d/init.d的软链接。并且这个东西只有在fedora下面 有,ubuntu下面没有/etc/rc.d/这个目录,只有/etc/init.d,openSUSE下面有/etc/rc.d,直接链接的/etc /init.d。
并且有时候可以看到rc0.d/这样的目录,查看这些目录里的文件,ls -l,发现都是软链接。
要想搞明白这里面的关系就要搞明白Linux的运行级。打开/etc/inittab,里面应该有注释,
# 0 – 停机(千万别把initdefault设置为0,否则系统永远无法启动)
# 1 – 单用户模式
# 2 – 多用户,没有 NFS
# 3 – 完全多用户模式(标准的运行级)
# 4 – 系统保留的
# 5 – X11 (x window)
# 6 – 重新启动 (千万不要把initdefault 设置为6,否则将一直在重启 )
不同的运行级,开机启动的时候会开启不同的服务,所以当开机以后执行init(pdi为1,是开机后执行的第一个进程,所有其他进程都是这个进程的后代)这个进程,就会根据不同的运行级开启不同的默认服务(fedora下是读取rc.sysinit)。
可以看到rc0.d/这样的目录下的脚本前面都带有S或者K,s就是start,k就是kill。比如说当你从运行级5到3切换的时候,可能就会关掉有些服务,这时候就会执行k开头的脚本。
并且字母后面会接着数字,表示的是脚本执行的先后顺序,数字越小越早执行,很多时候这些执行顺序是很重要的,比如要启动Apache服务,就必须先配置网络接口,不然一个没有IP的机子来启动http服务那岂不是很搞笑…
总结的说,/etc/init.d这个目录是所有服务的脚本,可以通过执行脚本并且加上参数,开启关闭或者重启对应的服务,rc.d/这个目录的放的应该就 是开机就默认开启的服务,并且根据系统不同的运行及划分了不同的rc0.d/这样的目录,ubuntu下面的rc0.d/这样的目录都是直接放在/etc /下面的。
讲完了这个文件夹的作用,然后就把我们自己的脚本放到这个文件下,并添加到启动文件里就可以了,具体的方法如下:(以开机自启一个脚本为例)
//1.首先要自定义一个脚本,比如自己创建一个脚本
sudo touch startshell.sh
//2.然后编辑这个脚本
sudo nano startshell.sh
//3.比如脚本内容如下:(第一行是要添加的解释器,后面是要执行的指令内容)
#!/bin/bash //如果这个解释器不行 就换成这个 #!/bin/sh
echo "hello world" > /usr/local/test.log
exit 0
//4.编写了脚本之后,将脚本文件移动到/etc/init.d/文件夹中并添加权限
sudo mv startshell.sh /etc/init.d/
cd /etc/init.d/
sudo chmod 777 startshell.sh
//5.添加开机启动
sudo update-rc.d startshell.sh defaults 90 //后边的这个90是优先级,数越大,执行的越晚
//删除开机启动
sudo update-rc.d -f startshell.sh remove
至此,整个过程就结束了,然后sudo reboot 重启一下看一下有没有自启程序就好了(这里说一下,我看这个init.d文件夹里好多的脚本并没有.sh后缀,其实好像创建文件的时候不加.sh也行,那么之后的全部命令涉及到这个文件的命令也都不要加.sh了)
说一下我的测试结果,结果就是没有成功,不知道是哪里出了问题,这个脚本里面写的是写hello world到test.log,自己打开系统后查看一下有没有这个文件就好了,网上确实好多说这个方法可以,我是没有成功,直到我使用第三种方法rc.local时注意到一个问题就是 是不是自己脚本出了问题,也就是脚本的解释器出了问题或者写的有问题。或者自己先在一个终端里执行一下这个脚本,看看每一句都有没有执行。我的那个脚本在我自己打开的终端里执行了,没有问题,但是放到这个init.d文件夹里开机自启还是不行。
还有一个重要的问题就是,比如自己在自己开的终端里执行了这个脚本没啥问题,但是开机执行时会有问题,有一个问题就是没有source,个人理解是因为那个终端与自己开的终端不太一样,自己开的终端每打开一次就会提前执行 source ~/.bashrc 但是这个终端好像没有,因此需要自己source,把source语句添加到自己的脚本里面,例如这样:
#! /bin/bash
source /opt/ros/noetic/setup.bash
source /home/tymiao/wsh/catkin_ws/devel/setup.bash
gnome-terminal -- roscore;
sleep 2s
gnome-terminal -- sudo chmod 777 /dev/ttyAMA2;sudo chmod 777 /dev/mem;sudo chmod 777 /dev/gpiomem;sudo chmod 777 /dev/ttyAMA0;sudo chmod 777 /dev/ttyAMA1;sudo chmod 777 /dev/ttyAMA3;sudo pigpiod;
sleep 2s
gnome-terminal -- roslaunch teleop_twist_joy teleop.launch;
sleep 2s
gnome-terminal -- rosrun learning_communication client_joy;
sleep 2s
gnome-terminal -- rosrun learning_communication server;
还有一点就是,我是想开机后自启自己的程序,并且不打开屏幕(自己已经设置了不连接显示器树莓派依旧可以启动,参考方法树莓派(Raspberry Pi)不接显示器启动失败),同时关闭系统界面,控制的话就用ssh控制。
如果你的脚本里面的程序有需要输入密码的,那我们就设置执行命令时免输密码,否则自启就没有意义了,具体的步骤参考Ubuntu执行sudo命令时免输密码
大家试试这个方法,如果成功了麻烦在评论区告我一下,万分感谢。
启动ubuntu应用程序首选项管理:
gnome-session-properties
如果上面这个命令没有执行成功,那就根据提示sudo apt-get install安装就行了
名称随便写,注释也是随便写。命令的话,如果你是执行脚本,直接点击后边的浏览选中脚本就可以了,这里会显示脚本的绝对路径,如果你是要执行命令。那就直接写命令就可以了。然后点击添加,最后点击右下角的关闭就可以了(重点:当你不想让他自启时,仅仅把自己添加的启动程序前面的对号取消是不行的,重启后还是会自启,只有删除才能解除自启)
如果你的脚本里面的程序有需要输入密码的,那我们就设置执行命令时免输密码,否则自启就没有意义了,具体的步骤参考Ubuntu执行sudo命令时免输密码
说一下这个方法的结果,结果就是成功了,能自启,但是有一点问题,而且这个问题还不小,就是当我不连接显示器时,他就不会自启,或者我不连接显示器,能够进入系统,但是不会自启我的程序,当我使用nomachine打开系统的界面时才会自启。意思是只要我不打开系统的图像界面,就不会自启,我打开图像界面才会自启(无论以何种方式打开界面,连接显示器或者使用nomachine)这很奇怪,达不到我的要求,不得不另寻方法,如果你们有人解决了这个问题 麻烦给俺讲一下,感谢!!!
在运行这个方法之前我遇到的问题是没有这个文件,这个文件的路径应该在/etc/rc.local,但是我没有,因此就参考了Ubuntu /etc/rc.local 不存在、Ubuntu 20.04 手动实现 rc.local完成了rc.local的创建,rc-local.service文件我是有的。ubuntu18.04设置开机启动命令/脚本的三种方法(可sudo)这里的方法三也是可以的,总之创建了/etc/rc.loacl文件、给rc.local文件执行权限并启动服务后就可以了。
rc.local脚本会在ubuntu开机后自动执行,因此我们可以将启动命令卸载此文件种,例如:
#!/bin/sh -e
#
# rc.local
#
# ……
#
cd /home/User/Desktop/ && ./test.sh
exit 0
注意:编辑时需要root权限,如果该方法没有正确启动,检查log内容。需要注意的一个点:rc.local中的脚本会在系统登录前执行,这是我们还没进入桌面,因此有可能会执行失败。可能正是没有进入桌面的原因所以,系统能够在不打开桌面的情况下自启程序,达到了我的要求。
但是当我加入的脚本的时候,例如向上边这样,会失败,不能自启,经过检查发现是终端的问题。检查的方法是在exit0之前加入这句话:echo “hello world” > /usr/local/test.log,注意是在自己的脚本后面,因为如果在/usr/local/test.log发现了自己打印的内容,说明这个rc.local执行了只不过test.sh脚本出现了点问题
例如:
#!/bin/sh -e
#
# rc.local
#
# ……
#
cd /home/User/Desktop/ && ./test.sh
echo "hello world" > /usr/local/test.log
exit 0
经过查阅,发现了问题,参考Ubuntu中rc.local 中命令不执行说是shell的问题,有些命令需要在bash shell中进行,不能在dash中运行
解决方案:
1.将/etc/rc.local的命令改成更加兼容的模式,将"#!/bin/sh"改为"#!/bin/bash"
2.将/bin/sh重新链接到/bin/bash,方法如下:
方法一:终端执行 sudo dpkg-reconfigure dash,然后选择 no.
方法二:重新进行软链接,执行以下命令:
sudo rm /bin/sh
sudo ln -s /bin/bash /bin/sh
还有5.树莓派程序自启动、Python脚本自启动(rc.local不自启动原因)的解决方案
这样就将/bin/sh链接到了/bin/bash。reboot系统后,命令正常执行。
还有记得要sudo chmod +x 脚本 给脚本增加权限
但是我真的太菜了,依旧运行失败 (大家可能会成功),因此不得不将脚本里面的东西自己弄到了rc.local里面,具体是运行了几个ros节点,然后就将几个包编写成一个launch文件里面了 直接在rc.loacl里面加了一句命令roslaunch xx xxx然后才解决了我的问题。
这是我成功的/etc/rc.local
#!/bin/bash
source /opt/ros/noetic/setup.bash
source /home/tymiao/wsh/catkin_ws/devel/setup.bash
#roscore
sudo chmod 777 /dev/ttyAMA2
sudo chmod 777 /dev/mem
sudo chmod 777 /dev/gpiomem
sudo chmod 777 /dev/ttyAMA0
sudo chmod 777 /dev/ttyAMA1
sudo chmod 777 /dev/ttyAMA3
sudo pigpiod
roslaunch nlink_parser move.launch
echo "hello 301" > /usr/local/test.log
exit 0
树莓派本来资源就很有限,因此把图像界面给关掉能省一些资源出来,同时也能降低功耗,因此我这里有两个关闭系统图像界面的方法:一是通过ubuntu系统关系图像界面,二是通过raspiberry-configer关闭界面,关闭界面后我们使用ssh控制就可以了。
关闭用户图形界面
sudo systemctl set-default multi-user.target
sudo reboot
开启用户图形界面
sudo systemctl set-default graphical.target
sudo reboot
注意:关闭图形界面后一定要将显示器连接树莓派来查看系统界面有无关闭,不要使用nomachine远程操控软件查看,经过我的测试不管用什么方法关闭图形界面,使用nomachine连接后都有图形界面。但事实是真关闭了
// 打开boot设置界面
sudo raspi-config
选择第3个Boot Options
选择B1 Desktop / CLI
这里有四个选项,上面两个就是没有图形界面,下面两个就是有图形的,我们选中 " B2 Console Autologin " 不要图形界面并且默认登录pi用户(免去每次进入都手动输入用户名密码),按回车。
退出(按ESC)设置界面,重启sudo reboot树莓派即可。
通过连接显示器查看确实是关闭了图像界面,显示的画面是ubuntu mate的logo 一直在转,看似是在进入系统,实则已经进入了系统并且将会一直显示这个界面。但是,nomachine连接到后依旧会有图形界面。
好了 本次总结就到这里,继续努力。
1.Ubuntu中rc.local 中命令不执行
2.Ubuntu /etc/rc.local 不存在
3.Ubuntu 20.04 手动实现 rc.local
4.Ubuntu通过 Update-rc.d 或 rc.local 设置开机启动执行脚本
5.ubuntu18.04设置开机启动命令/脚本的三种方法(可sudo)
6.linux系统/etc/init.d目录下的开机自启脚本
7.Ubuntu开机自启动脚本/命令的几种方案
8.ubuntu 开机自动执行脚本
9.ubuntu20.04.3正确关闭桌面
10.ubuntu20.04 关闭/开启图形化界面
11.ubuntu开机自启 开机自启ROS节点
12.Ubuntu下开机自启动ros程序笔记(包含rosrun和roslaunch)
13.ubuntu开机自启 开机自启ROS节点
14.Ubuntu Mate 开机自启ROS
15.Ubuntu18.04 关闭和开始图形界面
16.Ubuntu执行sudo命令时免输密码
17.Ubuntu Mate 开机自启ROS
18.etc/init.d目录是什么
19.5.树莓派程序自启动、Python脚本自启动(rc.local不自启动原因)
20.树莓派-关闭可视化界面