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,则按照我书写的顺序进⾏读取(如果存在,就不继续
读取)
linux循环执行命令脚本出于个性化和最⼩⼲预原则考虑,通常我们只对 ~/ ⽬录下的终端配置⽂件进⾏读写操作,也就是
~/.profile
~/.bashrc
这两个⽂件(通常 ~/.bash_profile 和 ~/.bash_login 是不存在的,所以不管它)。
我们知道,~/.profile ⽂件每次登录只读取⼀次,⽽ ~/.bashrc 除了登录时读取,每次打开终端,执⾏ shell script 时都会读取⼀次。显然我们需要的是 ~/.profile,每次登录时执⾏,并将该任务挂到后台执⾏。
明⽩了原理,接下来就简单了。打开 ~/.profile,在⽂件开头写⼊
# Redshift protects 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 的更多知识,参见:,感谢译者的⾟苦付出。
⽅法四:写 crontab ⽂件
这个⽅法,当属四个⽅法中最简单的了。
使⽤如下命令创建⼀个 cron 任务
crontab -e
这会弹出⼀个编辑窗⼝,输⼊以下内容
@reboot /usr/bin/redshift
在⼀些 Linux 发⾏版(如 ArchLinux),默认情况下 cron 功能是被关闭的,使⽤如下命令,将对应服务的开启即可
sudo systemctl enable cronie
关于 crontab,还有的可说。这⾥就不深究了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。