一、系统服务管理脚本
源码/二进制安装的,编写服务管理脚本。
systemctl 管理
模仿:在测试环境安装一个rpm包,参考脚本。
1、RHEL7 systemctl
systemd 将过去所谓的 daemon 执行脚本通通称为一个服务单位 (unit),而每种服务单位依据功能来区分时,就分类为不同的类型 (type)。
基本的类型有包括系统服务、数据监听与交换的插槽档服务 (socket)、储存系统状态的快照类型、提供不同类似执行等级分类的操作环境 (target) 等等。
哇!这么多类型,那设定时会不会很麻烦呢?其实还好,因为配置文件都放置在底下的目录中:
l /usr/lib/systemd/system/:每个服务最主要的启动脚本设定,有点类似以前的 /etc/init.d 底下的文件;
l /run/systemd/system/:系统执行过程中所产生的服务脚本,这些脚本的优先序要比 /usr/lib/systemd/system/ 高!
l /etc/systemd/system/:管理员依据主机系统的需求所建立的执行脚本,其实这个目录有点像以前/etc/rc.d/rc5.d/Sxx 之类的功能!执行优先序又比 /run/systemd/system/ 高喔!
rhel7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,存在系统服务里,即:/usr/lib/systemd/system目录下
每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]
[Unit]:服务的说明
Description:描述服务
After:依赖,当依赖的服务启动之后再启动自定义的服务
表示如果network.target或sshd-keygen.service需要启动,那么nginx.service应该在它们之后启动。
[Service]服务运行参数的设置
Type=forking是后台运行的形式
PIDFile
: pid文件路径
ExecStartPre :启动服务之前执行的命令(启动前要做什么,上文中是测试配置文件 -t)
ExecStart为服务的具体运行命令
ExecReload为重启命令
ExecStop为停止命令
PrivateTmp=True表示给服务分配独立的临时空间
注意:启动、重启、停止命令全部要求使用绝对路径
[Install]服务安装的相关设置,可设置为多用户
Type字段定义启动类型。它可以设置的值如下:
- Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
- Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
- Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes使得systemd在服务进程退出之后仍然认为服务处于激活状态
- Type=notify:与 Type=simple相同,但约定服务会在就绪后向systemd发送一个信号。这一通知的实现由 libsystemd-daemon.so提供。
- Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Install区块,定义如何安装这个配置文件,即怎样做到开机启动。
WantedBy字段:表示该服务所在的 Target。
Target的含义是服务组,表示一组服务。WantedBy=multi-user.target指的是,nginx 所在的 Target 是multi-user.target。
这个设置非常重要,因为执行systemctl enable nginx.service命令时,nginx.service的一个符号链接,就会放在/etc/systemd/system目录下面的multi-user.target.wants子目录之中。
源码安装nginx,并提供服务脚本
1、下载nginx
[root@localhost ~]# wget -c https://nginx.org/download/nginx-1.24.0.tar.gz
2、解压
[root@localhost ~]# tar xf nginx-1.24.0.tar.gz -C /usr/local/src/
3、安装依赖
[root@localhost ~]# dnf install gcc gcc-c++ make pcre-devel openssl-devel -y
4、./configure
[root@localhost nginx-1.24.0]# mkdir -p /var/log/nginx/
[root@localhost nginx-1.24.0]# ./configure --prefix=/usr/local/nginx \
> --sbin-path=/usr/sbin/nginx \
> --http-log-path=/var/log/nginx/access.log \
> --error-log-path=/var/log/nginx/error.log \
> --pid-path=/run/nginx.pid
5、编译
[root@localhost nginx-1.24.0]# make
6、安装
[root@localhost nginx-1.24.0]# make install
7、服务脚本
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/bin/kill -s HUP $MAINPID
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=mixed
PrivateTmp=true
[Install]
WantedBy=multi-user.target
8、测试
2、RHEL6 及之前脚本
ubuntu 16.04
system v 脚本管理
1、Linux运行有七个级别
级别 描述
0 停机状态,系统默认运行级别不能设置为 0,否则系统不能正常启动。使用 init 0 命令,可关闭系统。
1 单用户状态,此状态仅 root 用户可登录。用于系统维护,禁止远程登录,相当于 Windows 下的安全模式。
2 多用户状态(无NFS)。没有网络服务。
3 完整的多用户状态(有NFS)。有网络服务,登录后进入控制台命令行模式。
4 系统未使用,保留一般不用,在一些特殊情况下可以用它来做一些事情。例如在笔记本电脑的电池用尽时,可以切换到这个模式来做一些设置。
5 图形化模式,登陆后进入图形GUI模式或GNOME、KDE图形化界面,如X Window系统。
6 系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动,就会一直开机重启开机重启。
在 /etc/rc.d 下有 7 个名为 rcN.d 的目录,对应系统的 7 个运行级别。
[root@uplooking ~]# ls /etc/rc.d | grep 'rc[0-9].d'
rc0.d
rc1.d
rc2.d
rc3.d
rc4.d
rc5.d
rc6.d
rcN.d 目录下都是一些符号链接文件,这些链接文件都指向 init.d 目录下的 service 脚本文件,命名规则为 “K+nn+服务名或S+nn+服务名”,其中 nn 为两位数字。
2、Rhel7默认使用xfs文件系统,rhel6默认为ext4文件系统,但从rhel6.8起开始支持xfs系统。
3、设置默认启动级别
Rhel6:vim /etc/inittab 将末行的id:3:initdefault中的3改为相应数字即可
Rhel7:rhel7采用了targets来定义运行级别,设置默认启动级别命令为systemctl set-default x.target ,重启后即可生效
查看:[root@node1 ~]# systemctl get-default
multi-user.target
设置:systemctl set-default graphical.target 图形界面
4、RHEL6 服务脚本
#!/bin/sh
#
# nginx - this script starts and stops the nginx daemin
#
# chkconfig: - 85 15 -- 指定在那个运行级别启动或关闭脚本,数字代表顺序
- 代表2345运行级别,也可以指定35
85 代表启动顺序 S85nginx
15 代表关闭顺序 K15nginx
# description: Nginx is an HTTP(S) server, HTTP(S) reverse \
# proxy and IMAP/POP3 proxy server
脚本功能说明
脚本增加执行权限:chmod +x /etc/init.d/nginx
添加成系统服务脚本:chkconfig --add nginx
设置开机自启动:chkconfig --level 35 nginx on
参考脚本
[root@localhost ~]# cat /etc/init.d/nginx
#!/bin/sh
#
# nginx Startup script for nginx
#
# chkconfig: - 85 15
# description: nginx is an HTTP and reverse proxy server
# Source function library.
. /etc/rc.d/init.d/functions
if [ -L $0 ]; then
initscript=`/bin/readlink -f $0`
else
initscript=$0
fi
nginx=${NGINX:-/usr/sbin/nginx}
prog=`/bin/basename $nginx`
conffile=${CONFFILE:-/usr/local/nginx/conf/nginx.conf}
lockfile=${LOCKFILE:-/var/lock/subsys/nginx}
pidfile=${PIDFILE:-/var/run/nginx.pid}
SLEEPSEC=${SLEEPSEC:-1}
UPGRADEWAITLOOPS=${UPGRADEWAITLOOPS:-5}
CHECKSLEEP=${CHECKSLEEP:-3}
RETVAL=0
start() {
echo -n $"Starting $prog: "
${nginx} -c ${conffile}
RETVAL=$?
echo
[ $RETVAL = 0 ] && touch ${lockfile}
return $RETVAL
}
stop() {
echo -n $"Stopping $prog: "
/bin/sh -c "/bin/kill -s TERM $(/bin/cat $pidfile)"
RETVAL=$?
echo
[ $RETVAL = 0 ] && rm -f ${lockfile} ${pidfile}
}
reload() {
echo -n $"Reloading $prog: "
/bin/sh -c "/bin/kill -s HUP $(/bin/cat $pidfile)"
RETVAL=$?
echo
}
check() {
if [ "$#" -ne 0 ] ; then
case "$1" in
-q)
FLAG=$1
;;
*)
;;
esac
shift
fi
${nginx} -t -c ${conffile} $FLAG
RETVAL=$?
return $RETVAL
}
status() {
if [ -f $pidfile ]
then
RETVAL=0
else
RETVAL=1
fi
return $RETVAL
}
# See how we were called.
case "$1" in
start)
status
[ $? -ne 0 ] && start
;;
stop)
stop
;;
status)
status
[ $? -ne 0 ] && echo "nginx not running.." || echo "nginx is running..."
;;
restart)
check -q || exit $RETVAL
stop
start
;;
*)
echo $"Usage: $prog {start|stop|restart|status}"
RETVAL=2
esac
exit $RETVAL
# chmod +x /etc/init.d/nginx
# chkconfig --add nginx
# systemctl daemon reload
# chkconfig nginx on