系统服务管理脚本

一、系统服务管理脚本

源码/二进制安装的,编写服务管理脚本。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值