CentOS7/Linux开机自启动

懒人运维必备get,服务器每次重启,都需要手动启动一些服务,快用脚本来提升一点效率吧,体验盒子分享三个(nginx/php/mysql)最常用的开机自启动脚本。开机自启动的实现是通过服务管理来控制的。

Linux服务管理service和systemctl

CentOS 7继承了RHEL 7的新的特性,例如强大的systemctl,systemctl服务管理的配置和service相比变的简单而易用了许多。

service

service命令其实是去/etc/init.d目录下,去执行相关程序,在低版本的Linux中使用service进行服务管理很常见。但在centos 7中我们有了更好的选择systemctl。

# service命令启动redis脚本
$ service redis start
# 直接启动redis脚本
$ /etc/init.d/redis start
# 开机自启动
$ update-rc.d redis defaults
# service命令启动redis脚本
$serviceredisstart
# 直接启动redis脚本
$/etc/init.d/redisstart
# 开机自启动
$update-rc.dredisdefaults
systemctl

CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,最好还是存在系统服务里面,即:/usr/lib/systemd/system目录下,每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]

systemctl命令兼容了service,即systemctl也会去/etc/init.d目录下,查看,执行相关程序:

$ systemctl redis start
$ systemctl redis stop
# 开机自启动
systemctl enable redis
$systemctlredisstart
$systemctlredisstop
# 开机自启动
systemctlenableredis
systemctl常用命令
systemctl --version:查看版本。
whereis systemctl:查看位置。
systemctl list-unit-files:列出所有可用单元(服务)。 systemctl list-units:列出所有运行中的单元。
systemctl --failed:列出所有失败的单元。
systemctl list-unit-files | grep enable:查看自启动的软件。
systemctl is-enabled mysqld.service:查看某个单元是否开机启动。
systemctl status mysqld.service:查看某个单元的状态。 systemctl start mysqld.service:启动某个单元。
systemctl restart mysqld.service:重启某个单元。
systemctl stop mysqld.service:停止某个单元。
systemctl daemon-reload:修改了某个单元的配置文件后,重载配置文件。
systemctl reload mysqld.service:重载某个单元。
systemctl enable mysqld.service:设置开机自启动。 systemctl disable mysqld.service:关闭开机自启动。 systemctl kill mysqld,杀死单元。
CentOS7开机自启动Nginx/PHP-FPM/mysqld

我们可以使用systemctl -a来查看所有服务,如果列表里面没有Nginx,PHP、Mysql,又想借助于systemctl来进行统一管理的话,就到上述所说的/usr/lib/systemd/system目录下面创建以下文件吧

Nginx开机自启动:nginx.service

创建配置

vim /usr/lib/systemd/system/nginx.service
vim/usr/lib/systemd/system/nginx.service
配置自启动内容
[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s stop
PrivateTmp=true
[Install]
WantedBy=multi-user.target


[Unit]
Description=nginx
After=network.target
[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx-sreload
ExecStop=/usr/local/nginx/sbin/nginx-sstop
PrivateTmp=true
[Install]
WantedBy=multi-user.target
PHP开机自启动:php.service
创建配置
vim /usr/lib/systemd/system/php.service
1
vim/usr/lib/systemd/system/php.service
配置自启动内容
[Unit]
Description=php
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/php/sbin/php-fpm
ExecStop=/bin/pkill -9 php-fpm
PrivateTmp=true
[Install]
WantedBy=multi-user.target


[Unit]
Description=php
After=network.target
[Service]
Type=forking
ExecStart=/usr/local/php/sbin/php-fpm
ExecStop=/bin/pkill-9php-fpm
PrivateTmp=true
[Install]
WantedBy=multi-user.target
Mysql开机自启动:mysqld.service
创建配置
vim /usr/lib/systemd/system/mysqld.service
1
vim/usr/lib/systemd/system/mysqld.service
配置自启动内容
[Unit]
Description=MySQL Community Server
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
Alias=mysql.service
[Service]
User=mysql
Group=mysql
#systemctl status就是根据pid来判断服务的运行状态的
PIDFile=/var/run/mysqld/mysqld.pid
# 以root权限来启动程序
PermissionsStartOnly=true
# 设置程序启动前的必要操作。例如初始化相关目录等等
ExecStartPre=/usr/bin/mysql-systemd-start pre
# 启动服务
ExecStart=/usr/bin/mysqld_safe
# Don't signal startup success before a ping works
ExecStartPost=/usr/bin/mysql-systemd-start post
# Give up if ping don't get an answer
TimeoutSec=600
#Restart配置可以在进程被kill掉之后,让systemctl产生新的进程,避免服务挂掉
Restart=always
PrivateTmp=false

[Unit]
Description=MySQLCommunityServer
After=network.target
After=syslog.target
[Install]
WantedBy=multi-user.target
Alias=mysql.service
[Service]
User=mysql
Group=mysql
#systemctl status就是根据pid来判断服务的运行状态的
PIDFile=/var/run/mysqld/mysqld.pid
# 以root权限来启动程序
PermissionsStartOnly=true
# 设置程序启动前的必要操作。例如初始化相关目录等等
ExecStartPre=/usr/bin/mysql-systemd-startpre
# 启动服务
ExecStart=/usr/bin/mysqld_safe
# Don't signal startup success before a ping works
ExecStartPost=/usr/bin/mysql-systemd-startpost
# Give up if ping don't get an answer
TimeoutSec=600
#Restart配置可以在进程被kill掉之后,让systemctl产生新的进程,避免服务挂掉
Restart=always
PrivateTmp=false
上述文件创建完成后,只要使用systemctl enable命令就可以将所编写的服务添加至开机启动了。例如:
# 重新载入 systemd
$ systemctl daemon-reload
# 将php服务添加至开机启动。执行enable命令后,会自动创建一个软链接/etc/systemd/system/multi-user.target.wants/php.service指向此文件。
$ systemctl enable php.service
$ Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.
# 启动和查看php是否已设置为开机启动
$ systemctl start php
$ systemctl status php.service
$ systemctl is-enabled php.service

# 重新载入 systemd
$systemctldaemon-reload
# 将php服务添加至开机启动。执行enable命令后,会自动创建一个软链接/etc/systemd/system/multi-user.target.wants/php.service指向此文件。
$systemctlenablephp.service
$Createdsymlinkfrom/etc/systemd/system/multi-user.target.wants/nginx.serviceto/usr/lib/systemd/system/nginx.service.
# 启动和查看php是否已设置为开机启动
$systemctlstartphp
$systemctlstatusphp.service
$systemctlis-enabledphp.service

脚本命令说明

[Unit]:主要是对这个服务的说明,内容包括Description和After,Description用于描述服务,After用于描述服务类别。

[Service]:服务的关键,是服务的一些具体运行参数的设置,这里 Type=forking是后台运行的形式,PIDFile为存放PID的文件路径,ExecStart为服务的具体运行命令,ExecReload为重启命令,ExecStop为停止命令,PrivateTmp=True表示给服务分配独立的临时空间。

[Service]:启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!

[Install]:服务安装的相关设置,可设置为多用户的。

服务脚本按照上面编写完成后,以754的权限保存在/usr/lib/systemd/system目录下,这时就可以利用systemctl进行配置了。

使用systemctl start [服务名(也是文件名)]可以测试服务是否可以成功运行,如果不能运行则可以使用systemctl status [服务名(也是文件名)]查看错误信息和其他服务信息。然后根据报错进行修改,直到可以start,如果不放心还可以测试restart和stop命令。