Linux 设置程序开机自启动(服务器架设篇)

Linux 开机自启动

很多后端技术软件安装时自身没有开机启动脚本,为了实现服务器宕机重启或者其他情况重启后服务的自动运行就需要我们手动编写自启动脚本来达到目的,下面我以CentOS7为例演示几种常见的自启动方式

运行环境

软件 版本
Cent OS/RHEL 7.x

这里主要有2种方式:

  1. 开机自启动脚本
  2. 系统服务(推荐)

开机自启动脚本

在CentOS7之前版本,把启动脚本放在/etc/rc.d/rc.local目录即可.但CentOS7,/etc/rc.d/rc.local文件的权限被降低了,开机的时候执行自己的脚本是不能起动一些服务的,为了正确的执行我们需要赋上可执行权限

我以nginx为例演示怎么开机自启动

1
2
3
4
5
6
7
8
9
10
11
# 首先我正确的安装了Nginx
[thinktik@vm01 ~]$ ps -ef | grep nginx
root 3226 1 0 11:16 ? 00:00:00 nginx: master process /home/thinktik/install/nginx/sbin/nginx
nobody 3231 3226 0 11:16 ? 00:00:00 nginx: worker process
thinktik 3723 3692 0 11:33 pts/0 00:00:00 grep --color=auto nginx
[thinktik@vm01 ~]$ netstat -nlp|grep nginx
(No info could be read for "-p": geteuid()=1000 but you should be root.)
[thinktik@vm01 ~]$ su
Password:
[root@vm01 thinktik]# netstat -nlp | grep nginx
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3226/nginx: master

开始配置自启动

编写启动脚本

我将下面的内容写入nginx安装目录下的sbin文件夹下面,和nginx启动文件同目录。命名为autorun.sh

1
2
3
4
5
#!/bin/bash
#descirption:nginx开机自启动脚本

# 启动nginx
/home/thinktik/install/nginx/sbin/nginx

文件结构

1
2
3
4
5
6
7
8
9
10
# autorun.sh和nginx启动文件同目录并且有可执行权限
[root@vm01 sbin]# vim autorun.sh
[root@vm01 sbin]# pwd
/home/thinktik/install/nginx/sbin
[root@vm01 sbin]# ls
autorun.sh nginx
[root@vm01 sbin]# ll
total 5740
-rwxrwxr-x. 1 thinktik thinktik 108 May 23 11:04 autorun.sh
-rwxrwxr-x. 1 thinktik thinktik 5872640 May 23 10:59 nginx

设置自启动

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 编辑/etc/rc.d/rc.local
[root@vm01 sbin]# vim /etc/rc.d/rc.local

# 加入如下内容到/etc/rc.d/rc.local
su - root -c /home/thinktik/install/nginx/sbin/autorun.sh

# 保存修改并将/etc/rc.d/rc.local赋予可执行权限

# /etc/rc.d/rc.local 修改后的效果如下

#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

touch /var/lock/subsys/local
# 这里是修改
su - root -c /home/thinktik/install/nginx/sbin/autorun.sh

到这里就可以了,自己尝试重新启动CentOS7后检查nginx是否在系统重新启动后启动了

这种方式的优缺点:

优点:编写简单
缺点:灵活性差,启动思维比较老旧,一般只能做到开机自启动,对启动后的服务修改和管理能力几乎没有

系统服务(推荐)

写服务文件(模板)

1
2
3
4
5
6
7
8
9
10
[Unit]:服务的说明
Description:描述服务
After:在哪些服务后面运行

[Service]服务运行参数的设置
Type:forking是后台运行的形式
ExecStart:为服务的具体运行命令
ExecReload:为重启命令
ExecStop:为停止命令
PrivateTmp=True表示给服务分配独立的临时空间

编写nginx服务内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[Unit]
Description=nginx服务
Documentation=http://nginx.org/en/docs/
After=network.target remote-fs.target nss-lookup.target

[Service]
Type=forking
PIDFile=/home/thinktik/install/nginx/logs/nginx.pid
ExecStartPre=/home/thinktik/install/nginx/sbin/nginx
ExecStart=/home/thinktik/install/nginx/sbin/nginx
ExecReload=/home/thinktik/install/nginx/sbin/nginx -s reload
ExecStop=/bin/kill -s QUIT $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

将上nginx内容写入服务

1
2
3
4
5
6
7
8
9
10
11
12
# 新建一个nginx.service文件填入上面的内容
[thinktik@vm01 ~]$ vim /usr/lib/systemd/system/nginx.service
[thinktik@vm01 ~]$ su
Password:
# 设置开机启动
[root@vm01 thinktik]# systemctl enable nginx.service
# 启动服务
[root@vm01 thinktik]# systemctl start nginx.service
# 重启服务
[root@vm01 thinktik]# systemctl start nginx.service
# 关闭服务
[root@vm01 thinktik]# systemctl stop nginx.service

到这里就可以了,自己尝试重新启动CentOS7后检查nginx是否在系统重新启动后启动了

这种方式的优缺点:

优点:将安装的软件做成服务,功能强大灵活,符合CentOS7新的服务标准.
缺点:有些软件编写服务文件比较复杂,对编写者的要求比较好,需要对Linux了解比较好