Linux开机自动化执行脚本的四种方法(真实案例分享)

最近眼睛有点疼,可能是长时间面对电脑屏幕的原因罢。百度后安装了Redshift这款护眼工具,只要事先写好配置文件它会根据你的地理位置自动调节屏幕亮度。

可是每次开机都要自己输入命令,好麻烦。我讨厌毫无必要的麻烦。想是不是可以编写一个自动化脚本,每次开机自己执行——

以上,便是我写本文的初衷。希望看到本文的有缘人,如果和我有一样困扰读后能有所帮助。

在这里插入图片描述



方法一:写 .profile 文件

先科普下 Linux 系统的四(六)个类似却又不同的文件

  • /etc/profile:系统配置文件,用户登录时读取一次
  • /etc/bash.bashrc:系统配置文件 ,用户登录时读取一次,每次打开一个新终端会话时读取一次
  • ~/.profile(~/.bash_profile、~/.bash_login):用户配置文件,用户登录时读取一次
  • ~/.bashrc:用户配置文件,用户登录时读取一次,每次打开一个新终端会话时读取一次

有几点提请注意

  1. 系统配置文件作用于全局,而用户配置文件仅针对当前登录的用户
  2. 先读取系统配置文件,再读取用户配置文件,用户配置文件的变量和表达式等都继承自系统配置文件
  3. 我是 Ubuntu OS,如果你是 Red Hat OS,请将 /etc/bash.bashrc 改成 /etc/bashrc
  4. Ubuntu 本身没有 ~/.bash_profile,需要你自己创建同名文件,它只对 bash 有效,而 ~/.profile 作用于任何绑定的 shell 终端
  5. 对于 ~/.bash_profile、~/.bash_login、~/.profile,如果终端绑定的是 bash,则按照我书写的顺序进行读取(如果存在,就不继续读取)

出于个性化和最小干预原则考虑,通常我们只对 ~/ 目录下的终端配置文件进行读写操作,也就是

  • ~/.profile
  • ~/.bashrc

这两个文件(通常 ~/.bash_profile 和 ~/.bash_login 是不存在的,所以不管它)。

我们知道,~/.profile 文件每次登录只读取一次,而 ~/.bashrc 除了登录时读取,每次打开终端,执行 shell script 时都会读取一次。显然我们需要的是 ~/.profile,每次登录时执行,并将该任务挂到后台执行。

明白了原理,接下来就简单了。打开 ~/.profile,在文件开头写入

# Redshift protects your eyes... happy coding!!
redshift &

搞定。


方法二:写 rc.local 文件

网上别的教程都很老了,新版本的 Ubuntu 改变了很多~ ~

Ubuntu 18.04 的桌面不再使用 Untiy,而用 Gnome;也不再使用 inited 管理系统,转而改用 systemd,最重要的是,新版本 Ubuntu 没有 rc.local 这个文件…… 本文与时俱进,针对最新 Ubuntu 18.04

首先打开终端,敲

sudo systemctl status rc.local # 或者rc.loca.service,后缀名加不加都一样(是别名)

查看 rc.local 服务的状态(尚未启动)

在这里插入图片描述
试试看能不能正常启动

sudo systemctl enable rc.local  # 启动 rc.local 服务,重启后仍有效

在这里插入图片描述
如上如所示,这就是 Ubuntu 自己的锅了,新版本的 Ubuntu 删去了 /etc/rc.local(等一众文件…),取而代之的是 systemd 命令,也就是说新版本的 Ubuntu,人家开发者说了,建议你使用 systemd 进行自动化管理。好!有什么不好呢,这就是说多了一条解决问题的道路。不过也是先把延眼前的问题解决了再说,先把 rc.local 给活动起来。

打开编辑器,在 rc-local.service 文件中写入以下信息

sudo nano /etc/systemd/system/rc-local.service
[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target

自 Ubuntu 16.10 开始,便取消了 /etc/rc.local,使用下面的命令进行创建

printf '%s\n' '#!/bin/bash' 'exit 0' | sudo tee -a /etc/rc.local

并赋予执行权限

sudo chmod +x /etc/rc.local  # 没有足够的执行权限可能会出现下面的情况

在这里插入图片描述

最后将该服务重新激活,如果什么都没有回显说明一切顺利(Linux 哲学:无即是好)

sudo systemctl enable rc-local

接着重新启动该服务脚本,并查看状态,看到 active 字眼则说明成功。

sudo systemctl restart /etc/rc-local.service
sudo systemctl status /etc/rc-local.service

在这里插入图片描述

前期配置功课做好了,接下来就可以开始你最擅长的部分:敲代码、写文件了!
格式很简单,文件第一行按照惯例指出解释器,文件末了来一句 exit 0 表示正常结束。

#!/usr/sh
#在这里
#这里
#还有这里
#填写你要执行的命令
exit 0  # 这句话表示正常退出,很重要请加上

值得注意的是,如果写的是执行的脚本名,应该填写它的全名(绝对路径),因为当系统 boot(启动)的时候 rc.local 执行,这时候并没有用户登录,也就没有读取工作目录的相关信息。

好,你都懂了。那怎么写呢?你又懂了,就这么写。

#!/usr/sh
/usr/bin/redshift  # 如果不确定,先用 which 命令查看执行脚本的绝对路径
exit 0

是不是超级简单?呵呵。然而我不推荐这种做法。如果你是 Ubuntu 16.10+,还是老实的用方法三罢!


方法三:写 systemd 文件

前面说了,既然新版本 Ubuntu 推荐使用 systemd,那就恭敬不如从命。依了它罢!

再说一遍,从 Ubuntu 16.10 开始的新版本全部使用 systemd 实现初始化时服务的自启动。

sudo nano /etc/systemd/system/mystartup.service  # mystartup 是你要自启动的任务
sudo chmod 664 /etc/systemd/system/mystartup.service

从实用出发,我直接给出 redshift 的服务配置文件

[Unit]
Description=redshift

[Service]
ExecStart=/usr/bin/redshift

[Install]
WantedBy=multi-user.target

一旦你改变了服务配置文件,请使用下面的命令进行同步

sudo systemctl daemon-reload

启动该服务,在系统 boot 时激活

sudo systemcrl enable redshift.service

最后,使用该命令查看服务的 log 信息

journalctl -u redshift.service

有关 systemd 的更多知识,参见:systemd命令中文速查,感谢译者的辛苦付出。


方法四:写 crontab 文件

这个方法,当属四个方法中最简单的了。

使用如下命令创建一个 cron 任务

crontab -e

这会弹出一个编辑窗口,输入以下内容

@reboot /usr/bin/redshift

在一些 Linux 发行版(如 ArchLinux),默认情况下 cron 功能是被关闭的,
使用如下命令,将对应服务的开启即可

sudo systemctl enable cronie

在这里插入图片描述
关于 crontab,还有的可说。这里就不深究了。

©️2020 CSDN 皮肤主题: 撸撸猫 设计师:设计师小姐姐 返回首页