Ubuntu16、18 开机 自启动脚本或命令

举报
一颗小树x 发表于 2020/12/02 23:18:21 2020/12/02
【摘要】  背景 开发过程中,有时需要一些sh脚本、python脚本、命令等在开机的时候自动执行;通过查看网上的许多文章和教程,得出了两种比较便捷的开机自启方法。 目录 方法一:rc.local脚本(Ubuntu16及之前版本) 实现(Ubutu16 及之前的版本) 实现(Ubuntu18) 方案二:update-rc.d(Ubuntu18)推荐   方法一...

 背景

开发过程中,有时需要一些sh脚本、python脚本、命令等在开机的时候自动执行;通过查看网上的许多文章和教程,得出了两种比较便捷的开机自启方法。

目录

方法一:rc.local脚本(Ubuntu16及之前版本)

实现(Ubutu16 及之前的版本)

实现(Ubuntu18)

方案二:update-rc.d(Ubuntu18)推荐


 

方法一:rc.local脚本(Ubuntu16及之前版本)

这种方法比较适合于ubuntu16及之前的版本;毕竟像ubunutu18本来是不带rc.local脚本的(但是本文也能实现)

简介

rc.local脚本是一个Ubuntu开机后会自动执行的脚本,在该脚本内添加命令行,开机时会自动执行。

  • 脚本路径:/etc/rc.local

  • 需要root权限才能修改。

实现(Ubutu16 及之前的版本)

1)打开rc.local脚本

sudo vi   /etc/rc.local

不熟悉vi编辑工具的朋友可以使用vim、gedit等工具代替vi

 

2)在rc.local脚本添加命令

在exit 0前添加要执行的命令,里面可以直接写命令或者执行Shell脚本文件sh

例如:让ubuntu系统实现每隔5s执行一次温度检测脚本:net-temperature.sh

这里可以指定sh脚本的路径目录;

watch -n 5  是指每隔5s重复执行net-temperature.sh (关于对watch不了解的朋友,推荐搜索认识一下)

 

rc.local脚本的设置开机自动执行的sudo命令也是可以执行的;比如:


  
  1. #!/bin/sh -e
  2. #
  3. # rc.local
  4. #
  5. # This script is executed at the end of each multiuser runlevel.
  6. # Make sure that the script will "exit 0" on success or any other
  7. # value on error.
  8. #
  9. # In order to enable or disable this script just change the execution
  10. # bits.
  11. #
  12. # By default this script does nothing.:
  13. sudo sh run_name.sh
  14. exit 0

rc.local命令不执行,程序不启动的问题

1、添加log,查看程序执行情况

2、rc.local文件头部/bin/sh修改为/bin/bash

3、如果是执行sh文件,那么要赋予执行权限sudo chmod +x xxx.sh,然后启动时加上sudo sh xxx.sh

 

实现(Ubuntu18)

Ubuntu 18 不再使用initd管理系统,而是使用systemd

参阅下列链接

https://askubuntu.com/questions/886620/how-can-i-execute-command-on-startup-rc-local-alternative-on-ubuntu-16-10

ubuntu-18.04不能像ubuntu16一样通过编辑rc.local来设置开机启动脚本,通过下列简单设置后,可以使rc.local重新发挥作用。

1、建立rc-local.service文件

sudo vi /etc/systemd/system/rc-local.service

2、将下列内容复制进rc-local.service文件


  
  1. [Unit]
  2. Description=/etc/rc.local Compatibility
  3. Documentation=man:systemd-rc-local-generator(8)
  4. ConditionFileIsExecutable=/etc/rc.local
  5. After=network.target
  6. [Service]
  7. Type=forking
  8. ExecStart=/etc/rc.local start
  9. TimeoutSec=0
  10. RemainAfterExit=yes
  11. GuessMainPID=no
  12. [Install]
  13. WantedBy=multi-user.target
  14. Alias=rc-local.service

内容解释:

启动文件主要分成三部分

[Unit] 段: 启动顺序与依赖关系;

[Service] 段: 启动行为,如何启动,启动类型;

[Install] 段: 定义如何安装这个配置文件,即怎样做到开机启动;

 

3、创建文件rc.local  

sudo vi /etc/rc.local 

4、将下列内容复制进rc.local文件


  
  1. #!/bin/sh -e
  2. #
  3. # rc.local
  4. #
  5. # This script is executed at the end of each multiuser runlevel.
  6. # Make sure that the script will "exit 0" on success or any other
  7. # value on error.
  8. #
  9. # In order to enable or disable this script just change the execution
  10. # bits.
  11. #
  12. # By default this script does nothing.
  13. # 要执行的命令或脚本
  14. #
  15. #
  16. exit 0

创建软链接

 systemd 默认读取 /etc/systemd/system 下的配置文件, 所以还需要在 /etc/systemd/system 目录下创建软链接

ln -s /lib/systemd/system/rc.local.service /etc/systemd/system/

 

5、给rc.local加上权限

sudo chmod +x /etc/rc.local

6、启用服务

sudo systemctl enable rc-local

这个命令 等同于

sudo ln -s '/usr/lib/systemd/system/rc-local' '/etc/systemd/system/multi-user.target.wants/rc-local'

Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。 systemctl enable命令用于在上面两个目录之间,建立符号链接关系。

如果配置文件里面设置了开机启动,systemctl enable命令相当于激活开机启动。

与之对应的,systemctl disable命令用于在两个目录之间,撤销符号链接关系,相当于撤销开机启动。(这个是选择操作)

sudo systemctl disable rc-local
 

此时可以重启电脑了。

 

7、启动服务并检查状态

sudo systemctl start rc-local.service

sudo systemctl status rc-local.service

 

 

方案二:update-rc.d(Ubuntu18)不推荐

使用  update-rc.d,我们可以添加和删除服务,并将它们添加到Ubuntu / Debian启动脚本中,实现开启自启动效果。

实现过程:

首先来到/etc/init.d/目录下,执行如下命令

cd /etc/init.d/

1)新建个脚本文件 new_service.sh


  
  1. #!/bin/bash
  2. # command content
  3. exit 0

2)设置权限

sudo chmod +x new_service.sh
 

3)将脚本添加到开机启动脚本

执行如下指令,在这里90表明一个优先级,越高表示执行的越晚 (优先级范围:0~90)

sudo update-rc.d new_service.sh defaults 90

 

4)查看全部服务列表

sudo service --status-all
 

这时应该能看到新加开机启动脚本(new_service.sh的名字在列表中;说明开机时会启动这个sh脚本的。

附加:看到列表中,启动前面会可能出现以下三种状态de

  • [+] –具有此标志的服务当前正在运行。
  • [–] –具有此标志的服务当前未运行。
  • [?] –没有  状态开关的服务。

   左图中只是列举一部分

5)检测new_service.sh能否正常运行

sudo service new_service.sh start

运行命令没报错,然后查脚本是否起作用,如果起作用了,那说明成功了;

然后重启电脑;等待一会(1~3分钟左右),查看是否自动开启脚本的功能。

 

服务的启动停止状态

xxx为第4步查询得来的启动服务(脚本)名字

sudo service xxx status
sudo service xxx start
sudo service xxx stop
sudo service xxx restart

 

其他

移除开机启动脚本

sudo rm /etc/init.d/new_service.sh


 

希望对你有帮助。

 

 

文章来源: guo-pu.blog.csdn.net,作者:一颗小树x,版权归原作者所有,如需转载,请联系作者。

原文链接:guo-pu.blog.csdn.net/article/details/103999467

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。