23 Shell Script服务脚本
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个级别,每种级别之间的差异其实就是启动脚本的种类数量不同而已
级别 | 含义 |
---|---|
0 | halt(Do NOT set initdefault to this) |
1 | Single user mode |
2 | Multiuser,without NFS (The same as 3, if you do not have networking) |
3 | Full multiuser mode |
4 | unused |
5 | X11 |
6 | reboot(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
相关文章:

23 Shell Script服务脚本
Linux 服务脚本 一、Linux 开机自动启动服务 linux开机服务原理: ①linux系统启动首先加载kernel ②初始操作系统 ③login验证程序等待用户登陆 初始化操作系统 kernel加载/sbin/init创建用户空间的第一个程序 该程序完成操作系统的初…...

三周精通FastAPI:3 查询参数
查询参数 FastAPI官网手册:https://fastapi.tiangolo.com/zh/tutorial/query-params/ 上节内容:https://skywalk.blog.csdn.net/article/details/143046422 声明的参数不是路径参数时,路径操作函数会把该参数自动解释为**查询**参数。 from…...

大语言模型学习指南:入门、应用与深入
0x00 学习路径概述 本文将学习路径划分为三个部分:入门篇、应用篇、深入篇。每个章节针对不同的学习需求,帮助你从基础知识入手,逐步掌握大语言模型(LLM)的使用、应用开发以及技术原理等内容。 学习目标 入门篇&…...

【Linux-进程间通信】匿名管道+4种情况+5种特征
匿名管道 匿名管道(Anonymous Pipes)是Unix和类Unix操作系统中的一种通信机制,用于在两个进程之间传递数据。匿名管道通常用于命令行工具之间的数据传递; 匿名管道的工作原理是创建一个临时文件,该文件被称为管道文件…...

Perl打印9x9乘法口诀
本章教程主要介绍如何用Perl打印9x9乘法口诀。 一、程序代码 1、写法① use strict; # 启用严格模式,帮助捕捉变量声明等错误 use warnings; # 启用警告,帮助发现潜在问题# 遍历 1 到 9 的数字 for my $i (1..9) {# 对于每个 $i,遍历 1…...

Android--第一个android程序
写在前边 ※安卓开发工具常用模拟器汇总Android开发者必备工具-常见Android模拟器(MuMu、夜神、蓝叠、逍遥、雷电、Genymotion...)_安卓模拟器-CSDN博客 ※一般游戏模拟器运行速度相对较快,本文选择逍遥模拟器_以下是Android Studio连接模拟器实现(先从以上博文中…...

MySQL的并行复制原理
1. 并行复制的概念 并行复制(Parallel Replication)是一种通过同时处理多个复制任务来加速数据复制的技术。它与并发复制的区别在于,并行复制更多关注的是数据块或事务之间的并行执行,而不是单纯的任务并发。在数据库主从复制中&…...

2023年五一杯数学建模C题双碳目标下低碳建筑研究求解全过程论文及程序
2023年五一杯数学建模 C题 双碳目标下低碳建筑研究 原题再现: “双碳”即碳达峰与碳中和的简称,我国力争2030年前实现碳达峰,2060年前实现碳中和。“双碳”战略倡导绿色、环保、低碳的生活方式。我国加快降低碳排放步伐,大力推进…...

信息安全工程师(57)网络安全漏洞扫描技术与应用
一、网络安全漏洞扫描技术概述 网络安全漏洞扫描技术是一种可以自动检测计算机系统和网络设备中存在的漏洞和弱点的技术。它通过使用特定的方法和工具,模拟攻击者的攻击方式,从而检测存在的漏洞和弱点。这种技术可以帮助组织及时发现并修补漏洞ÿ…...

练习题 - Scrapy爬虫框架 Spider Middleware 爬虫页中间件
在 web 爬虫开发中,Scrapy 是一个非常强大且灵活的框架,它可以帮助开发者轻松地从网页中提取数据。Scrapy 的下载器中间件(Downloader Middleware)是 Scrapy 处理下载请求和响应的一个重要组件。通过使用和编写下载器中间件,开发者可以自定义请求的处理过程,增加请求头信…...

探索C++的工具箱:双向链表容器类list(1)
引言 在C中,std::list 是一个标准库提供的容器类,属于C STL(标准模板库)。std::list 是一种独特而强大的容器,它使用双向链表结构来管理元素。无论是在处理动态数据集合,还是在需要频繁进行插入和删除操作时…...

大厂高频算法考点--单调栈
什么是单调栈: 单调栈就是借助一个栈,在仅仅使用当前栈的条件下,时间复杂度是N(n),将每个节点最有离这他最近的大于或者是小于的数据返回,将已知数组的元素放到栈里。再自我实现的代码里面我们使用数组实现…...

Unity使用Git及GitHub进行项目管理
git: 工作区,暂存区(存放临时要存放的内容),代码仓库区1.初始化 git init 此时展开隐藏项目,会出现.git文件夹 2.减小项目体积 touch .gitignore命令 创建.gitignore文件夹 gitignore文件夹的内容 gitignore中添加一下内容 # This .gitignore file should be place…...

如何将本地 Node.js 服务部署到宝塔面板:完整的部署指南
文章简介: 将本地开发的 Node.js 项目部署到线上服务器是开发者常见的工作流程之一。在这篇文章中,我将详细介绍如何将本地的 Node.js 服务通过宝塔面板(BT 面板)上线。宝塔面板是一个强大的服务器管理工具,具有简洁的…...

SpringBoot项目启动报错:命令行太长解决
文章目录 SpringBoot项目启动报错:命令行太长解决1. 第一种方法1. 第二种方法1-1 旧版本Idea1-2 新版本Idea 3. 重新启动SpringBoot项目即可解决 SpringBoot项目启动报错:命令行太长解决 报错信息: 1. 第一种方法 1. 第二种方法 找到项目…...

使用Docker启动的Redis容器使用的配置文件路径等问题以及Python使用clickhouse_driver操作clickhouse数据库
一、使用Docker启动的Redis容器使用的配置文件路径等问题 1.docker启动的redis使用的配置文件路径是什么 使用docker搭建redis服务,本身redis启动的时候可以指定配置文件的, redis-server /指定配置文件路径/redis.conf。 但手上也没有一个redis配置文件…...

硬盘格式化后能恢复数据吗?4款好用的数据恢复软件,格式化后也能安心
咱们今天来谈谈一个挺烦人的问题——硬盘格式化后能恢复数据吗?别担心,能的!只要你用对方法,就算硬盘被清空了,那些重要文件还是能找回来的。下面,我就给你们介绍几款超给力的数据恢复软件,让你…...

【选择C++游戏开发技术】
在选择C游戏开发技术时,以下几个因素是需要考虑的: 1. 游戏类型:不同类型的游戏可能需要不同的技术。例如,2D游戏通常采用基于精灵的引擎,而3D游戏通常采用基于物理模拟的引擎。根据游戏类型选择适合的技术是很重要的…...

Oracle数据库系统表空间过大,清理SYSTEM、SYSAUX表空间
一.前言 在oracle数据库中,system为系统表空间,存放着一些我们经常用到的系统表和视图,sysaux为辅助表空间,辅助着系统表空间。这两个表空间不宜添加数据文件,会使系统表空间过于臃肿,从而影响数据库的使用…...

LaTeX参考文献工具和宏包bibmap项目简介
LaTeX参考文献工具和宏包bibmap项目简介 LaTeX 中的参考文献生成方式主要有三种:第一种是手动写thebibliography环境的,第二种事基于bibtex程序的,第三种则是基于biblatex宏包和biber程序的。本文介绍的bibmap项目则提供了第四种方法。目前b…...

微软的 Drasi:一种轻量级的事件驱动编程方法
微软的开源数据变化处理平台有望提供一种全新的方式来构建和管理可产生持续事件流的云应用程序。 Microsoft Azure 孵化团队是微软超大规模云中比较有趣的组成部分之一。它介于传统软件开发团队和研究组织之间,致力于构建大规模分布式系统问题的解决方案。 这些解决…...

vue3 笔记-插槽
结构类似的模块,我们可以考虑用插槽,以便后续复用: 代码: 1.插槽 <script setup> defineProps({title: {required: true,type: String},number: {required: true,type: Number} }) </script><template><d…...

C# 字符串常用方法
文章目录 Length:获取字符串中字符的个数(不包括末尾的空字符)ToLower() 和 ToUpper():将字符串转换为小写或大写形式Substring(int startIndex, int length):从指定索引开始截取指定长度的子字符串Remove(int startIn…...

字节跳动青训营——入营考核解答(持续更新中~~~)
考核内容: 在指定的题库中自主选择不少于 15 道算法题并完成解题,其中题目难度分配如下: 简单题不少于 10 道中等题不少于 4 道困难题不少于 1 道 解答代码 8.进制求和转换(难) 代码实现: import jav…...

JavaWeb合集15-Apache POI
十五、Apache POI Apache POI是一个处理Miscrosoft Office各种文件格式的开源项目。简单来说就是,我们可以使用POI在Java 序中对Miscrosoft Office各种文件进行读写操作。一般情况下,POI都是用于操作Excel文件。 使用场景:银行网银系统导出交…...

Threejs 实现3D 地图(01)创建基本场景
"d3": "^7.9.0", "three": "^0.169.0", "vue": "^3.5.10" <script setup> import { onMounted,ref } from vue import * as THREE from three import * as d3 from "d3"; //莫开托坐标 矫正地图…...

snmpdelta使用说明
1.snmpdelta介绍 snmpdelta命令是用来获取下一个节点的OID的值。 2.snmpdelta安装 1.snmpdelta安装 命令: yum -y install net-snmp net-snmp-utils [root@logstash ~]# yum -y install net-snmp net-snmp-utils Loaded plugins: fastestmirror Loading mirror speeds f…...

Hadoop集群安装
集群规划 node01node02node03角色主节点从节点从节点NameNode√DataNode√√√ResourceManager√NodeManager√√√SecondaryNameNode√Historyserver√ 上传安装包到node01 解压到指定目录 tar -zxvf /bigdata/soft/hadoop-3.3.3.tar.gz -C /bigdata/server/ 创建软链接 cd…...

VuePress集成到Vue项目的方法
VuePress 可以作为一个独立的静态站点生成器来使用,也可以集成到现有的 Vue 项目中。以下是将 VuePress 集成到 Vue 项目的几种方法: 1. 作为本地依赖集成 如果你想在现有的 Vue 项目中使用 VuePress 来管理文档,你可以将 VuePress 安装为本…...

【ROS】ROS局域网下多机通讯方法
最近工作中需要用到多机通讯,这里稍微总结一下使用方法。 目录 一、网络配置 二、修改两个设备的hosts文件 三、修改两个ros设备的.bashrc 四、launch文件中给节点设定运行的设备 一、网络配置 首先确保两个ros设备连接到同一局域网下,然后查询两个…...