23 Shell Script服务脚本

devtools/2024/10/20 9:52:56/

Linux 服务脚本

一、Linux 开机自动启动服务

​ linux开机服务原理:

​ ①linux系统启动首先加载kernel

​ ②初始操作系统

​ ③login验证程序等待用户登陆

​ 初始化操作系统

​ kernel加载/sbin/init创建用户空间的第一个程序

​ 该程序完成操作系统的初始化:

​ /etc/inittab文件是/sbin/init程序读取的配置文件

# inittab is no longer used when using systemd.
#
# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.
#
# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target
#
# systemd uses 'targets' instead of runlevels. By default, there are two main targets:
#
# multi-user.target: analogous to runlevel 3
# graphical.target: analogous to runlevel 5
#
# To view current default target, run:
# systemctl get-default
#
# To set a default target, run:
# systemctl set-default TARGET.target
#

​ 0-6,6个级别,每种级别之间的差异其实就是启动脚本的种类数量不同而已

级别含义
0halt(Do NOT set initdefault to this)
1Single user mode
2Multiuser,without NFS (The same as 3, if you do not have networking)
3Full multiuser mode
4unused
5X11
6reboot(Do NOT set initdefault to this)

​ 每个级别对应在/etc/rc.d下都有自己的目录

[root@localhost ~]# ls -l /etc/rc.d
total 4
drwxr-xr-x. 2 root root  70 May 15 23:05 init.d
drwxr-xr-x. 2 root root  45 Nov 16  2020 rc0.d
drwxr-xr-x. 2 root root  45 Nov 16  2020 rc1.d
drwxr-xr-x. 2 root root  45 Nov 16  2020 rc2.d
drwxr-xr-x. 2 root root  45 Nov 16  2020 rc3.d
drwxr-xr-x. 2 root root  45 Nov 16  2020 rc4.d
drwxr-xr-x. 2 root root  45 Nov 16  2020 rc5.d
drwxr-xr-x. 2 root root  45 Nov 16  2020 rc6.d
-rw-r--r--. 1 root root 473 Dec  7  2023 rc.local

​ /etc/rc.d目录:

​ init.d目录是所有的原始服务脚本

​ rc*.d目录中是对init.d目录中脚本的软连接

[root@localhost ~]# ls -l /etc/rc.d/rc3.d
total 0
lrwxrwxrwx. 1 root root 20 Apr 17 04:27 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Apr 17 04:27 S10network -> ../init.d/network

二、Linux 服务管理操作

​ 不同级别中服务脚本的管理命令

​ chkconfig

​ chkconfig-updates and queries runlevelinformation for system services

​ 服务进程的管理命令

​ service

​ service -run a System V init scrip

chkconfig [--list] [--type type][name]

​ 显示系统服务,以及各个级别开关状态

[root@localhost ~]# chkconfig --listNote: This output shows SysV services only and does not include nativesystemd services. SysV configuration data might be overridden by nativesystemd configuration.If you want to list systemd services use 'systemctl list-unit-files'.To see services enabled on particular target use'systemctl list-dependencies [target]'.netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off

chkconfig --del name

​ 去除系统启动管理服务中的服务

# 删除服务
[root@localhost ~]# chkconfig --del network# 已经被删除
[root@localhost ~]# chkconfig --list networkNote: This output shows SysV services only and does not include nativesystemd services. SysV configuration data might be overridden by nativesystemd configuration.If you want to list systemd services use 'systemctl list-unit-files'.To see services enabled on particular target use'systemctl list-dependencies [target]'.service network supports chkconfig, but is not referenced in any runlevel (run 'chkconfig --add network')

chkconfig --add name

​ 添加系统服务,且服务脚本要在/etc/rc.d/init.d目录下

# 添加服务
[root@localhost ~]# chkconfig --add network# 查看是否添加
[root@localhost ~]# chkconfig --list networkNote: This output shows SysV services only and does not include nativesystemd services. SysV configuration data might be overridden by nativesystemd configuration.If you want to list systemd services use 'systemctl list-unit-files'.To see services enabled on particular target use'systemctl list-dependencies [target]'.network        	0:off	1:off	2:on	3:on	4:on	5:on	6:off

chkconfig [--level levels] [--type type] name <on|off|reset|resetpriorities>

​ 调整系统启动管理服务中的服务级别

# 将network在启动级别为1设置不启动
[root@localhost ~]# chkconfig --level 1 network on# 查看是否关闭
[root@localhost ~]# chkconfig --listNote: This output shows SysV services only and does not include nativesystemd services. SysV configuration data might be overridden by nativesystemd configuration.If you want to list systemd services use 'systemctl list-unit-files'.To see services enabled on particular target use'systemctl list-dependencies [target]'.netconsole     	0:off	1:off	2:off	3:off	4:off	5:off	6:off
network        	0:off	1:on	2:on	3:on	4:on	5:on	6:off

​ service SCRIPT COMMAND

​ SCRIPT:系统服务脚本名称,在/etc/rc.d/init.d或软连接的目录/etc/init.d目录中

​ COMMAND:脚本不同,但是基本包含{start|stop|status|restart|reload}

​ service --status-all

​ service network restart

# 查看network服务状态
[root@localhost ~]# service network status
Configured devices:
lo ens33
Currently active devices:
lo ens33

​ Linux系统服务脚本:

​ vi /etc/init.d/network

​ 脚本中必须包含以下两行

# chkconfig: 2345 10 90

​ 被注释的,表示调用chkconfig操作add时默认的各级别开启

​ 10:表示启动级别:先启动后关闭,最大值99

​ 90:表示停止级别:先启动后关闭,最大值99

# description: Activates/Deactivates all network interfaces configured to \

# start at boot time.

#! /bin/bash
#
# network       Bring up/down networking
#
# chkconfig: 2345 10 90
# description: Activates/Deactivates all network interfaces configured to \
#              start at boot time.
#
### BEGIN INIT INFO
# Provides: $network
# Should-Start: iptables ip6tables NetworkManager-wait-online NetworkManager $network-pre
# Short-Description: Bring up/down networking
# Description: Bring up/down networking
### END INIT INFO# Source function library.
. /etc/init.d/functions
……

​ 可以看到相应级别目录中的脚本名称前面包含K或S和一个数值

​ K:关闭服务,后面的数值是关闭优先级

​ S:启动服务,后面的数值是启动优先级

[root@localhost ~]# ls -l /etc/rc.d/rc3.d/
total 0
lrwxrwxrwx. 1 root root 20 Apr 17 04:27 K50netconsole -> ../init.d/netconsole
lrwxrwxrwx. 1 root root 17 Oct 16 08:26 S10network -> ../init.d/network

三、tomcat服务脚本

​ 安装java

# 下载java1.8
[root@localhost ~]# yum -y install java-1.8.0*# 验证是否安装成功
[root@localhost ~]# java -version
openjdk version "1.8.0_412"
OpenJDK Runtime Environment (build 1.8.0_412-b08)
OpenJDK 64-Bit Server VM (build 25.412-b08, mixed mode)

​ bash以交互方式启动时会加载/etc/profile文件,所以在这里定义的环境变量能被用户交互时用到,用户交互启动程序所依赖•

​ 但是系统服务脚本优先在用户登陆前启动,且不会读取/etc/profile

# 下载tomcat9.0
[root@localhost ~]# wget https://dlcdn.apache.org/tomcat/tomcat-9/v9.0.96/bin/apache-tomcat-9.0.96.tar.gz# 解压文件
[root@localhost ~]# tar -xzvf apache-tomcat-9.0.96.tar.gz # 进入tomcat/bin
[root@localhost ~]# cd apache-tomcat-9.0.96/bin# 启动服务
[root@localhost bin]# ./startup.sh
Using CATALINA_BASE:   /root/apache-tomcat-9.0.96
Using CATALINA_HOME:   /root/apache-tomcat-9.0.96
Using CATALINA_TMPDIR: /root/apache-tomcat-9.0.96/temp
Using JRE_HOME:        /usr
Using CLASSPATH:       /root/apache-tomcat-9.0.96/bin/bootstrap.jar:/root/apache-tomcat-9.0.96/bin/tomcat-juli.jar
Using CATALINA_OPTS:   
Tomcat started.# 查看运行进程
[root@localhost bin]# ps -ef | grep java
root       1648      1 25 11:07 pts/0    00:00:03 /usr/bin/java -Djava.util.logging.config.file=/root/apache-tomcat-9.0.96/conf/logging.properties -Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager -Djdk.tls.ephemeralDHKeySize=2048 -Djava.protocol.handler.pkgs=org.apache.catalina.webresources -Dorg.apache.catalina.security.SecurityListener.UMASK=0027 -Dignore.endorsed.dirs= -classpath /root/apache-tomcat-9.0.96/bin/bootstrap.jar:/root/apache-tomcat-9.0.96/bin/tomcat-juli.jar -Dcatalina.base=/root/apache-tomcat-9.0.96 -Dcatalina.home=/root/apache-tomcat-9.0.96 -Djava.io.tmpdir=/root/apache-tomcat-9.0.96/temp org.apache.catalina.startup.Bootstrap start
root       1676   1371  0 11:08 pts/0    00:00:00 grep --color=auto java# 关闭防火墙
[root@localhost bin]# systemctl stop firewalld
[root@localhost bin]# setenforce 0# 浏览器访问http://your_ip:8080# 停止服务
[root@localhost bin]# ./shutdown.sh

​ 但是这种运行方式需要用户干预,我们更希望的是服务器启动后能将tomcat作为系统服务启动

​ 我们自己实现一个tomcat的系统服务脚本

​ 对于service调取脚本可以传递给脚本的参数应该包含:

​ start

​ stop

​ restart

​ status

​ 作为服务脚本必须实现的内容:

# chkconfig: 123456 2079

# description: This is a Tomcat Server shell scripts

​ 另外,系统还有一个通用的工具脚本,其中包含了一些方便我们服务脚本开发的函数

. /etc/rc.d/init.d/functions

# 创建tomcat
[root@localhost bin]# touch /etc/init.d/tomcat# 添加执行权
[root@localhost bin]# chmod +x /etc/init.d/tomcat[root@localhost bin]# vi /etc/init.d/tomcat
#!/bin/bash
#
# chkconfig: 123456 2079
# description: This is a Tomcat Server shell scripts
. /etc/rc.d/init.d/functions

etc/rc.d/init.d/functions脚本介绍:

​ functions这个脚本是给/etc/init.d里边的文件使用的,提供了一些基础的功能

​ 重要函数:

​ checkpid:检查是否已存在pid,如果有一个存在,返回0(通过查看/proc目录)

​ daemon:启动某个服务。/etc/init.d目录部分脚本的start使用到这个

​ killproc:杀死某个进程。/etc/init.d目录部分脚本的stop使用到这个

​ status:返回一个服务的状态

​ 我们可以在自己的脚本中通过source或.的方式导入

​ tomcat有自己的服务管理脚本

​ 在系统服务脚本中判断服务进程状态

​ 最直接的方式是用进程的PID

​ 观察:bin/startup.sh

​ 发现最终调用catalina.sh脚本

​ 并传参start

​ 所以查找catalina.sh

​ 查找到这行:

elif [ "$1" = "start" ] ; then

​ 向下寻找到分支结束前,添加:

echo "CATALINA_PID:$!

# 打印pid
[root@localhost bin]# vi startup.sh
# 第519行,添加
echo "CATALINA_PID:$!"# 返回编写tomcat
[root@localhost bin]# vi /etc/init.d/tomcat
#!/bin/bash
#
# chkconfig: 123456 2079
# description: This is a Tomcat Server shell scripts
. /etc/rc.d/init.d/functions
tom_home=/root/apache-tomcat-9.0.96/bin
# tomcat启动后将进程ID存在这个文件中
tom_lock_file=/var/lock/subsys/tom.lock
tom_status(){if [ -f $tom_lock_file ]; thenlock_pid=`cat $tom_lock_file`if [ ! -z $lock_pid ];then# 调用函数来检测PID对应的进程是否存在if checkpid `cat $tom_lock_file`; thenecho "tomcat is running( $lock_pid )..." && return 0elseecho "tomcat ( $lock_pid )is not running but lock_fileexist" && return 1fififiecho "tomcat is not running ......"  && return 2
}
tom_start(){if ! tom_status >& /dev/null ; then# 这里启动tomcat,并获取pid存到锁文件中$tom_home/startup.sh |& grep "CATALINA_PID:" | sed 's/CATALINA_PID:\(.*\)/\1/' > $tom_lock_fileecho "tomcat started ..."fitom_status
}
tom_stop(){tom_status$tom_home/shutdown.sh >& /dev/nullecho "tomcat stoped..."echo '' > $tom_lock_file
}
tom_restart()
{tom_stopsleep 1tom_start
}
case $1 instatus)tom_status;;start)tom_start;;stop)tom_stop;;restart)tom_restart;;*)echo $"Usage: $0 {start|stop|status|restart}";;
esac

​ 设置开机自启动

[root@localhost bin]# chkconfig --level 3 tomcat on

http://www.ppmy.cn/devtools/127254.html

相关文章

GDAL+C#实现矢量多边形转栅格

1. 开发环境测试 参考C#配置GDAL环境&#xff0c;确保GDAL能使用&#xff0c;步骤简述如下&#xff1a; 创建.NET Framework 4.7.2的控制台应用 注意&#xff1a; 项目路径中不要有中文&#xff0c;否则可能报错&#xff1a;can not find proj.db 在NuGet中安装GDAL 3.9.1和G…

10月18日,每日信息差

第一、现代汽车集团在上海举办了中国前瞻技术研发中心的发布及启新庆典&#xff0c;宣布成立其全资法人公司 —— 现代前瞻汽车技术开发&#xff08;上海&#xff09;有限公司。该中心是集团在海外建立的首个前瞻技术研发中心&#xff0c;专注于自动驾驶、智能座舱、共享出行等…

【MR开发】在Pico设备上接入MRTK3(一)——在Unity工程中导入MRTK3依赖

写在前面的话 在Pico上接入MRTK3&#xff0c;目前已有大佬开源。 https://github.com/Phantomxm2021/PicoMRTK3 也有值得推荐的文章。 MRTK3在PICO4上的使用小结 但由于在MacOS上使用MRTK3&#xff0c;无法通过Mixed Reality Feature Tool工具管理MRTK3安装包。 故记录一下…

ssm配置模式

新版 用Java类&#xff0c;全注解demo案例 1. AppConfig.java (Spring主配置类)package com.example.config;import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.cont…

微信小程序+python+mysql,实现登录功能

1.前端 <!-- login.wxml --> <view class"container"><input type"text" placeholder"请输入用户名" bindinput"bindUsername" /><input type"password" placeholder"请输入密码" bindinpu…

简历怎么写?怎么准备面试?怎么让面试官感兴趣?

视频地址&#xff1a;如何写好简历打开找工作的第一道门_哔哩哔哩_bilibili项目介绍不过关&#xff0c;项目责任不清楚&#xff0c;项目技术方案有漏洞&#xff0c;项目优势不明显&#xff0c;八股文没有准备好。都是面试大忌讳。, 视频播放量 1、弹幕量 0、点赞数 0、投硬币枚…

20240803 芯动科技 笔试

文章目录 1、单选题1.11.21.31.42、填空题2.12.23、问答题3.13.23.34、编程题4.14.24.3岗位:嵌入式软件工程师(25届校招)(J12042) 题型:4 道单选题,2 道填空题, 3 道简答题,3 道编程题 1、单选题 1.1 已知 5 个元素的出栈序列是 1,2,3,4,5,6 则对应的入栈顺序可能是 …

【VUE】Vue中的过滤器

Vue中的过滤器filter就是一种可以复用的数据转换函数&#xff0c;主要用来对视图中的数据进行处理和格式化。通过管道符“|”来连接数据和过滤器。主要用来对视图中的数据进行处理和格式化。使用过滤器可以简化模板中的数据处理逻辑&#xff0c;使代码更加简洁易懂。 Vue中的过…