Linux开机自动化执行脚本的四种方法(真实案例分享)
Linux开机自动化执行脚本的四种方法(真实案例分享)
最近眼睛有点疼,可能是长时间面对电脑屏幕的原因罢。百度后安装了Redshift这款护眼工具,只要事先写好配置文件它会根据你的地理位置自动调节屏幕亮度。
可是每次开机都要自己输入命令,好麻烦。我讨厌毫无必要的麻烦。想是不是可以编写一个自动化脚本,每次开机自己执行——
以上,便是我写本文的初衷。希望看到本文的有缘人,如果和我有一样困扰读后能有所帮助。
方法一:写 .profile 文件
先科普下 Linux 系统的四(六)个类似却又不同的文件
- /etc/profile:系统配置文件,用户登录时读取一次
- /etc/bash.bashrc:系统配置文件 ,用户登录时读取一次,每次打开一个新终端会话时读取一次
- ~/.profile(~/.bash_profile、~/.bash_login):用户配置文件,用户登录时读取一次
- ~/.bashrc:用户配置文件,用户登录时读取一次,每次打开一个新终端会话时读取一次
有几点提请注意
- 系统配置文件作用于全局,而用户配置文件仅针对当前登录的用户
- 先读取系统配置文件,再读取用户配置文件,用户配置文件的变量和表达式等都继承自系统配置文件
- 我是 Ubuntu OS,如果你是 Red Hat OS,请将 /etc/bash.bashrc 改成 /etc/bashrc
- Ubuntu 本身没有 ~/.bash_profile,需要你自己创建同名文件,它只对 bash 有效,而 ~/.profile 作用于任何绑定的 shell 终端
- 对于 ~/.bash_profile、~/.bash_login、~/.profile,如果终端绑定的是 bash,则按照我书写的顺序进行读取(如果存在,就不继续读取)
出于个性化和最小干预原则考虑,通常我们只对 ~/ 目录下的终端配置文件进行读写操作,也就是
- ~/.profile
- ~/.bashrc
这两个文件(通常 ~/.bash_profile 和 ~/.bash_login 是不存在的,所以不管它)。
我们知道,~/.profile 文件每次登录只读取一次,而 ~/.bashrc 除了登录时读取,每次打开终端,执行 shell script 时都会读取一次。显然我们需要的是 ~/.profile,每次登录时执行,并将该任务挂到后台执行。
明白了原理,接下来就简单了。打开 ~/.profile,在文件开头写入
<span style="color:#000000"><code class="language-shell"><span style="color:#a57a4c"># Redshift protects your eyes... happy coding!!</span>
redshift <span style="color:#889b4a">&</span>
</code></span>
- 1
- 2
搞定。
方法二:写 rc.local 文件
网上别的教程都很老了,新版本的 Ubuntu 改变了很多~ ~
Ubuntu 18.04 的桌面不再使用 Untiy,而用 Gnome;也不再使用 inited 管理系统,转而改用 systemd,最重要的是,新版本 Ubuntu 没有 rc.local 这个文件…… 本文与时俱进,针对最新 Ubuntu 18.04
首先打开终端,敲
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> systemctl status rc.local <span style="color:#a57a4c"># 或者rc.loca.service,后缀名加不加都一样(是别名)</span>
</code></span>
- 1
查看 rc.local 服务的状态(尚未启动)
试试看能不能正常启动
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> systemctl <span style="color:#98676a">enable</span> rc.local <span style="color:#a57a4c"># 启动 rc.local 服务,重启后仍有效</span>
</code></span>
- 1
如上如所示,这就是 Ubuntu 自己的锅了,新版本的 Ubuntu 删去了 /etc/rc.local(等一众文件…),取而代之的是 systemd 命令,也就是说新版本的 Ubuntu,人家开发者说了,建议你使用 systemd 进行自动化管理。好!有什么不好呢,这就是说多了一条解决问题的道路。不过也是先把延眼前的问题解决了再说,先把 rc.local 给活动起来。
打开编辑器,在 rc-local.service 文件中写入以下信息
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> <span style="color:#98676a">nano</span> /etc/systemd/system/rc-local.service
</code></span>
- 1
<span style="color:#000000"><code class="language-shell"><span style="color:#999999">[</span>Unit<span style="color:#999999">]</span>
Description<span style="color:#889b4a">=</span>/etc/rc.local Compatibility
ConditionPathExists<span style="color:#889b4a">=</span>/etc/rc.local<span style="color:#999999">[</span>Service<span style="color:#999999">]</span>
Type<span style="color:#889b4a">=</span>forking
ExecStart<span style="color:#889b4a">=</span>/etc/rc.local start
TimeoutSec<span style="color:#889b4a">=</span>0
StandardOutput<span style="color:#889b4a">=</span>tty
RemainAfterExit<span style="color:#889b4a">=</span>yes
SysVStartPriority<span style="color:#889b4a">=</span>99<span style="color:#999999">[</span>Install<span style="color:#999999">]</span>
WantedBy<span style="color:#889b4a">=</span>multi-user.target
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
自 Ubuntu 16.10 开始,便取消了 /etc/rc.local,使用下面的命令进行创建
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">printf</span> <span style="color:#889b4a">'%s\n'</span> <span style="color:#889b4a">'#!/bin/bash'</span> <span style="color:#889b4a">'exit 0'</span> <span style="color:#889b4a">|</span> <span style="color:#98676a">sudo</span> <span style="color:#98676a">tee</span> -a /etc/rc.local
</code></span>
- 1
并赋予执行权限
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> <span style="color:#98676a">chmod</span> +x /etc/rc.local <span style="color:#a57a4c"># 没有足够的执行权限可能会出现下面的情况</span>
</code></span>
- 1
最后将该服务重新激活,如果什么都没有回显说明一切顺利(Linux 哲学:无即是好)
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> systemctl <span style="color:#98676a">enable</span> rc-local
</code></span>
- 1
接着重新启动该服务脚本,并查看状态,看到 active 字眼则说明成功。
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> systemctl restart /etc/rc-local.service
<span style="color:#98676a">sudo</span> systemctl status /etc/rc-local.service
</code></span>
- 1
- 2
前期配置功课做好了,接下来就可以开始你最擅长的部分:敲代码、写文件了!
格式很简单,文件第一行按照惯例指出解释器,文件末了来一句 exit 0 表示正常结束。
<span style="color:#000000"><code class="language-shell"><span style="color:#a57a4c">#!/usr/sh</span>
<span style="color:#a57a4c">#在这里</span>
<span style="color:#a57a4c">#这里</span>
<span style="color:#a57a4c">#还有这里</span>
<span style="color:#a57a4c">#填写你要执行的命令</span>
<span style="color:#98676a">exit</span> 0 <span style="color:#a57a4c"># 这句话表示正常退出,很重要请加上</span>
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
值得注意的是,如果写的是执行的脚本名,应该填写它的全名(绝对路径),因为当系统 boot(启动)的时候 rc.local 执行,这时候并没有用户登录,也就没有读取工作目录的相关信息。
好,你都懂了。那怎么写呢?你又懂了,就这么写。
<span style="color:#000000"><code class="language-shell"><span style="color:#a57a4c">#!/usr/sh</span>
/usr/bin/redshift <span style="color:#a57a4c"># 如果不确定,先用 which 命令查看执行脚本的绝对路径</span>
<span style="color:#98676a">exit</span> 0
</code></span>
- 1
- 2
- 3
是不是超级简单?呵呵。然而我不推荐这种做法。如果你是 Ubuntu 16.10+,还是老实的用方法三罢!
方法三:写 systemd 文件
前面说了,既然新版本 Ubuntu 推荐使用 systemd,那就恭敬不如从命。依了它罢!
再说一遍,从 Ubuntu 16.10 开始的新版本全部使用 systemd 实现初始化时服务的自启动。
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> <span style="color:#98676a">nano</span> /etc/systemd/system/mystartup.service <span style="color:#a57a4c"># mystartup 是你要自启动的任务</span>
<span style="color:#98676a">sudo</span> <span style="color:#98676a">chmod</span> 664 /etc/systemd/system/mystartup.service
</code></span>
- 1
- 2
从实用出发,我直接给出 redshift 的服务配置文件
<span style="color:#000000"><code class="language-shell"><span style="color:#999999">[</span>Unit<span style="color:#999999">]</span>
Description<span style="color:#889b4a">=</span>redshift<span style="color:#999999">[</span>Service<span style="color:#999999">]</span>
ExecStart<span style="color:#889b4a">=</span>/usr/bin/redshift<span style="color:#999999">[</span>Install<span style="color:#999999">]</span>
WantedBy<span style="color:#889b4a">=</span>multi-user.target
</code></span>
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
一旦你改变了服务配置文件,请使用下面的命令进行同步
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> systemctl daemon-reload
</code></span>
- 1
启动该服务,在系统 boot 时激活
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> systemcrl <span style="color:#98676a">enable</span> redshift.service
</code></span>
- 1
最后,使用该命令查看服务的 log 信息
<span style="color:#000000"><code class="language-shell">journalctl -u redshift.service
</code></span>
- 1
有关 systemd 的更多知识,参见:systemd命令中文速查,感谢译者的辛苦付出。
方法四:写 crontab 文件
这个方法,当属四个方法中最简单的了。
使用如下命令创建一个 cron 任务
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">crontab</span> -e
</code></span>
- 1
这会弹出一个编辑窗口,输入以下内容
<span style="color:#000000"><code class="language-shell">@reboot /usr/bin/redshift
</code></span>
- 1
在一些 Linux 发行版(如 ArchLinux),默认情况下 cron 功能是被关闭的,
使用如下命令,将对应服务的开启即可
<span style="color:#000000"><code class="language-shell"><span style="color:#98676a">sudo</span> systemctl <span style="color:#98676a">enable</span> cronie
</code></span>
- 1
关于 crontab,还有的可说。这里就不深究了。
Linux开机自动化执行脚本的四种方法(真实案例分享)相关推荐
- 开机自启动脚本_Linux配置开机自启动执行脚本的两种方法
代码来源:oschina 原文作者:醉生梦死zsms 原文链接:https://my.oschina.net/u/3285916/blog/1622358 本文版权归原作者所有,如有侵权请立即与我联系 ...
- Linux 开机自动执行脚本的两种方式
前言 很多情况下,我们都希望服务重启之后,很多应用都能自动启动,那么除了linux 提供的自启动配置之外,我们也可以在开机之后,通过指定 一些脚本的具体路径,或者是某个服务的启动命令具体路径,来进行服 ...
- linux如何创建共享内存,linux实现共享内存同步的四种方法
https://blog.csdn.net/sunxiaopengsun/article/details/79869115 本文主要对实现共享内存同步的四种方法进行了介绍. 共享内存是一种最为高效的进 ...
- Java创建并执行线程的四种方法
Java创建并执行线程的四种方法 java里面创建线程有四种方式: 无返回: 实现Runnable接口,重写run(); 继承Thread类,重写run(); 有返回: 实现Callable接口,重写 ...
- 在应用程序中替换Linux中Glibc的malloc的四种方法
打算优化系统的内存分配,接管glibc提供的内存管理,但是整个工程的代码量很大,使用malloc.realloc.calloc和free的地方到处都是,如果自己写好的接口需要重命名所有的调用,先不说工 ...
- linux下查看mysql版本的四种方法
Linux查看MySQL版本的四种方法 1 在终端下执行 mysql -V 2 在help中查找 mysql --help |grep Distrib 3 在mysql 里查看 select vers ...
- ubuntu18.04设置开机启动命令/脚本的三种方法(可sudo)
很多时候想开机时便启动想要启动的命令(甚至是需要sudo的命令). 但是如何设置呢,一般来说有以下三种方法. (本文针对的是ubuntu18.04设置开机启动命令或者脚本) 1 不用sudo的命令开机 ...
- 【Ubuntu笔记】ubuntu18.04设置开机启动命令/脚本的三种方法(可sudo)
转自微信 谭狗星 很多时候想开机时便启动想要启动的命令(甚至是需要sudo的命令). 但是如何设置呢,一般来说有以下三种方法. (本文针对的是ubuntu18.04设置开机启动命令或者脚本) 1 不用 ...
- linux c 结构体初始化的四种方法
定义: struct InitMember {int first:double second:char* third:float four; }; 方法一:定义时赋值 struct InitMembe ...
最新文章
- Android 测量调用方法耗时的方法
- Linux中使用export命令设置环境变量
- 邀请函|2021 云原生实战峰会,邀请您免费现场参会报名
- SPringBoot+mybatis 框架搭建例子
- MyBatis-学习笔记01【01.Mybatis课程介绍及环境搭建】
- C#代码总结02---使用泛型来获取Asp前台页面全部控件,并进行属性修改
- Go语言实战 : API服务器 (4) 配置文件读取及连接数据库
- IOS ActivityIndicator 活动指示器使用
- 如何为 MySQL 选择 CPU?
- C中error的使用
- DotPass for Mac(密码生成器)
- pantum打印机驱动安装m6506_奔图m6506驱动程序
- 浅谈安卓Xutils框架(一)
- 【qq机器人】定时发送消息大全
- C语言编程 - 推箱子小游戏源码分享 (含过关)
- 皮影机器人ppt_机器人皮影戏装置的制作方法
- 惠普m180n故障码04_惠普m180n打印机驱动(解决m180n打印机连接问题)V1.0 免费版
- linux读取excel并导入mysql_mysql命令行的导入导出sql,txt,excel(都在linux或windows命令行操作)(转自筑梦悠然)...
- 百度音频文件转写正式上线商用
- Django - Celery使用及介绍
热门文章
- 使用 ffmpeg 命令实现图片和视频相互转换
- 通过display:flex实现CSS垂直居中
- 您可以找到的 5 种最佳数据恢复软件
- Scratch编程:牛顿的苹果——地心引力
- iOS最新漏洞可实现“以假乱真”的iCloud密码钓鱼
- ubuntu 安装中文字库_在ubuntu10.04下安装中文字体
- Lab05-循环1(2019.10.21)
- 关于Maven不能下载 jar 的问题
- 计算机辅助药物设计manson,计算机辅助药物设计 薛定谔 autodock
- 第5讲、STM32、MPU9250等器件的Symbol绘制