Bootstrap

Linux 操作系统 023-进程开机自启

Linux 操作系统 023-进程配置开机自启

本节关键字:Linux、centos、进程开机自启
本节相关指令:echo、runlevel、date、systemctl、reboot、cat

方式一:使用 rc.local 功能

/etc/rc.d/rc.local本质上是一个shell脚本文件,可以把启动时需要执行的命令写在里面,启动时将按顺序执行。/etc/rc.d/rc.local脚本在操作系统启动时只执行一次。
linux操作系统启动流程图

假设待执行的自定义脚本 /home/user/test.sh 如下:

#!/bin/bash
/usr/bin/date >> /tmp/mydate.log
/usr/bin/sleep 10
/usr/bin/date >> /tmp/mydate.log

(1)在 /etc/rc.d/rc.local 文件中添加以下内容
/home/user/test.sh

(2)给 /etc/rc.d/rc.local 文件添加可执行权限
chmod +x /etc/rc.d/rc.local

(3)重启服务器,查看日志文件的内容

注意事项
(1)在 /etc/rc.d/rc.local 脚本中执行程序时时没有环境变量的,如果您执行的程序或脚本需要环境变量,需要自行在脚本中设置环境变量,也可以使用 su 切换用户来执行。例如,以oracle用户登录再执行sqlplus命令:
su - oracle -c “sqlplus scott/tiger @/tmp/test.sql”

(2)不要 /etc/rc.d/rc.local 挂起, /etc/rc.d/rc.local 是一个脚本,需要按顺序执行完的,执行完一个程序后才会执行下一个程序。如果某程序是后台程序,应该加 & 让程序运行在后台,否则 /etc/rc.d/rc.local 会挂起

方式二:使用 /etc/init.d/ 目录功能

假设待执行的自定义脚本 /home/user/test.sh 如下:

#!/bin/bash
/usr/bin/date >> /tmp/mydate.log
/usr/bin/sleep 10
/usr/bin/date >> /tmp/mydate.log

(1)将 /home/user/test.sh 脚本放在 /etc/init.d 目录下,并添加可执行权限
cp /home/user/test.sh /etc/init.d; chmod +x /etc/init.d/test.sh

(2)创建符号连接,/etc目录下有几个rc文件,rcS.d、rc0.d、rc1.d … rc6.d,其中0表示停止,1表示单用户模式,2-5表示多用户模式,6代表重启

(3)查看当前系统的启动级别: # runlevel

(4)假设当前系统的启动级别是5,就进入 etc/rc5.d 目录,并创建软链接:
# cd /etc/rc5.d; ln -vsf /etc/init.d/test.sh S98testSoftLink
(-v 显示链接过程 -s 软链接 -f 强制链接,命名规则是有要求的,开头必须是S,后面紧跟数字98是设定的启动序号,也可以叫做优先级,再后面的名字没限制)

(5)重启操作系统,查看日志文件/tmp/mydate.log,是否有记录

方式三:使用 crontab 功能

crond 是 linux 系统用来周期性的执行某种任务或等待处理某些事件的一个守护进程,与 windows 系统的计划任务类似,当安装完成操作系统后,默认会安装此服务工具,并且会自动启动 crond 进程,crond 进程每分钟会定期检查是否有要执行的任务,如果有要执行的任务,则自动执行该任务。
因此我们可以使用 crondtab 命令创建一个任务,让该任务在重启时进行执行。

# 进入编辑
$ crontab -e

# 创建任务,当操作系统重启时执行 /home/user/test.sh 脚本
@reboot /home/user/test.sh

# 保存 wq 命令保存退出
# 重启操作系统
reboot

# 查看日志
cat /tmp/mydate.log

方式四:使用 systemd 服务

Systemd 服务是一种以 .service 结尾的单元(unit)配置文件,用于控制由 Systemd 控制或监视的进程。简单说,用于后台以守护进程(daemon)的形式运行程序。

systmd service 文件一般放在 /etc/systemd/system/ 文件夹中。创建一个服务如下:

# 在 /etc/systemd/system/ 下创建一个服务
vi myser.service

// [Unit] 区块:启动顺序与依赖关系
[Unit]
// Description字段:给出当前服务的简单描述
Description=Run a Custom Script at Startup

// [Service] 区块:定义如何启动当前服务
[Service]
// ExecStart字段:定义启动进程时执行的命令
ExecStart=/home/user/test.sh

// [Install] 区块:定义如何安装这个配置文件,即怎样做到开机启动
[Install]
// WantedBy字段:表示该服务所在的Target,Target的含义是服务组,表示一组服务
WantedBy=default.target

# 使用 wq 保存退出

# 更新服务配置文件,并使能服务
systemctl daemon-reload
systemctl enable myser.service

# 重启操作系统
reboot
;