Linux:systemd进程管理【1】
整体理解
要快速掌握Linux的systemd并覆盖80%的使用场景,以下是最重要的20%知识点:
-
Systemd简介与核心功能:
- Systemd是一个系统和服务管理器,作为Linux系统的PID 1进程,负责启动和管理其他系统组件。
- 它提供并行启动服务的能力,显著加快系统启动时间。
- Systemd使用socket和D-Bus激活服务,按需启动守护进程,并跟踪使用Linux控制组的进程。
- 它还维护挂载和自动挂载点,实现基于依赖的服务控制逻辑,并支持SysV和LSB init脚本。
-
核心组件:
systemctl:Systemd的主命令行工具,用于控制服务和系统状态。systemd-journald:负责日志数据的收集和存储。systemd-analyze:用于分析系统启动性能和诊断性能问题。systemd-tmpfiles:创建、删除、清理临时和易失文件。
-
服务管理:
- 服务是systemd中代表后台进程或守护进程的单元,通过
systemctl命令管理服务的启动、停止、重启和状态检查。
- 服务是systemd中代表后台进程或守护进程的单元,通过
-
日志管理:
- Systemd集成了
journald日志系统,提供了统一的日志管理解决方案,可以通过journalctl命令进行日志查询。
- Systemd集成了
-
依赖管理和并行化处理:
- Systemd自动处理服务间的依赖关系,并并行启动服务,加快系统启动。
-
配置文件格式:
- Systemd使用unit文件(如
.service)来·管理服务配置,这些文件位于/etc/systemd/system和/lib/systemd/system目录下。
- Systemd使用unit文件(如
-
系统启动和目标:
- Systemd支持多个运行级别(targets),如
multi-user.target和graphical.target,用于定义不同的系统启动状态。
- Systemd支持多个运行级别(targets),如
-
网络管理:
systemd-networkd用于网络接口的设置和管理,而systemd-resolved提供网络名称解析服务。
掌握这些核心概念和工具,你将能够有效地管理和优化Linux系统上的服务和资源。
unit概念的理解
要快速掌握systemd中的unit并覆盖80%的使用场景,以下是最重要的20%知识点:
-
Unit的概念:
- Unit是systemd管理系统资源的基本单元,每个系统资源就是一个Unit,并使用一个Unit文件定义。
-
Unit的类型:
- Service unit(.service):用于定义系统服务。
- Target unit(.target):用于模拟实现“运行级别”。
- Device unit(.device):用于定义内核识别的设备。
- Mount unit(.mount):定义文件系统挂载点。
- Socket unit(.socket):用于标识进程间通信用到的socket文件。
- Snapshot unit(.snapshot):管理系统快照。
- Swap unit(.swap):用于标识swap设备。
- Automount unit(.automount):定义文件系统自动挂载点。
- Path unit(.path):用于定义文件系统中的一个文件或目录。
-
Unit文件结构:
- Unit文件通常包含三个配置区段:Unit和Install段(所有Unit文件通用),Service段(仅服务类型的Unit文件特有)。
- Unit段包含服务的描述、依赖等信息,如
Description、After、Requires等。 - Service段包含服务的具体管理和操作方法,如
ExecStart、ExecStop等。 - Install段定义了Unit如何随系统启动,如
WantedBy指定启动目标。
-
Unit文件的位置:
- Unit文件通常位于
/etc/systemd/system、/run/systemd/system和/usr/lib/systemd/system三个目录中,其中/etc/systemd/system中的文件具有最高优先级。
- Unit文件通常位于
-
管理Unit的命令:
systemctl start|stop|restart|reload <unit>:启动、停止、重启、重载服务。systemctl enable|disable <unit>:设置服务开机自启或不自启。systemctl status <unit>:查看服务状态。systemctl list-units:列出所有已加载的units。
掌握这些核心概念和操作,你将能够有效地管理和配置Linux系统中的systemd units。
UNIT示例
编写一个systemd service unit文件需要遵循一定的格式和包含必要的指令。下面是一个基本的systemd service unit文件的编写步骤和示例:
1. 确定文件位置和名称
通常,自定义的service unit文件应该放在/etc/systemd/system/目录下。文件名通常以.service结尾,例如myapp.service。
2. 编写Unit文件
一个典型的systemd service unit文件包含三个部分:[Unit]、[Service]和[Install]。以下是每个部分的基本指令和说明:
[Unit] 部分
Description:服务的描述。After:指定服务启动的顺序,依赖于哪些服务。Requires:指定服务必须依赖的服务,如果这些服务失败,则当前服务也会失败。Wants:指定服务希望启动的服务,但不是必需的。
[Service] 部分
Type:服务类型,如simple、forking、oneshot等。ExecStart:启动服务时执行的命令。ExecStop:停止服务时执行的命令(可选)。Restart:服务失败时的重启策略,如on-failure。User:运行服务的用户。WorkingDirectory:服务的工作目录。
[Install] 部分
WantedBy:指定服务应该被哪些target依赖,通常是multi-user.target或graphical.target。
3. 示例
下面是一个简单的systemd service unit文件示例,它定义了一个名为myapp.service的服务:
[Unit]
Description=My Custom Application Service
After=network.target[Service]
Type=simple
ExecStart=/usr/bin/myapp
Restart=on-failure
User=myappuser
WorkingDirectory=/home/myappuser[Install]
WantedBy=multi-user.target
4. 启用和启动服务
编写完unit文件后,你需要执行以下命令来启用服务,并在系统启动时自动启动:
sudo systemctl daemon-reload
sudo systemctl enable myapp.service
sudo systemctl start myapp.service
systemctl daemon-reload:重新加载systemd的配置文件,使新添加的unit文件生效。systemctl enable myapp.service:将服务设置为开机自启。systemctl start myapp.service:启动服务。
5. 检查服务状态
使用以下命令检查服务的状态:
sudo systemctl status myapp.service
通过遵循这些步骤,你可以创建自己的systemd service unit文件,并管理自定义服务。
守护进程
守护进程(Daemon)是Linux系统中的一种后台运行的特殊进程,通常用于提供持续的服务或等待处理某些请求。以下是掌握守护进程最重要的20%知识点,帮助你快速学习并覆盖80%的使用场景:
-
守护进程的定义和作用:
- 守护进程是一种在后台运行的进程,不与任何终端相关联,通常用于执行特定的系统任务或服务。
-
守护进程的特点:
- 它们通常在系统启动时启动,并一直运行直到系统关闭。
- 守护进程通常在后台运行,不与用户直接交互。
- 它们通常被设计为长时间运行,并且能够处理多个请求。
-
常见的守护进程:
sshd:提供SSH服务,允许远程登录。httpd或nginx:提供Web服务。crond:定时执行任务。syslogd:日志系统服务。
-
守护进程的启动方式:
- 守护进程可以通过
init系统(如System V init)、systemd或Upstart等系统和服务管理器启动。 - 它们也可以通过配置文件(如
/etc/init.d/下的脚本)启动。
- 守护进程可以通过
-
守护进程的进程管理:
- 守护进程通常在
/var/run目录下创建一个PID文件,记录其进程ID。 - 使用
ps、top或htop命令可以查看守护进程的状态。
- 守护进程通常在
-
守护进程的日志记录:
- 守护进程通常将日志发送到
syslog或直接写入到特定的日志文件中。
- 守护进程通常将日志发送到
-
守护进程的配置文件:
- 守护进程的配置文件通常位于
/etc目录下,例如/etc/httpd/conf/httpd.conf。
- 守护进程的配置文件通常位于
-
守护进程的安全性:
- 守护进程需要正确配置权限,以防止未授权访问。
- 使用防火墙和安全策略来保护守护进程。
-
守护进程的调试:
- 使用
strace跟踪系统调用,帮助调试守护进程。 - 查看守护进程的日志文件以诊断问题。
- 使用
-
守护进程的监控和维护:
- 使用
systemctl或service命令管理守护进程的启动、停止和重启。 - 定期检查守护进程的状态和日志,确保其正常运行。
- 使用
掌握这些关键知识点,你将能够理解和管理Linux系统中的守护进程,以及如何配置和维护它们以提供持续的服务。
unit的service中service部分type类型
在systemd的unit文件中,Service部分的Type指令定义了服务的启动类型,这对于服务的行为至关重要。以下是Type指令最重要的20%知识点,帮助你快速掌握并覆盖80%的使用场景:
-
simple:
- 这是默认的类型,适用于大多数服务。
ExecStart指定的命令会直接启动服务,systemd会监控其主进程。
- 这是默认的类型,适用于大多数服务。
-
forking:
- 适用于传统的Unix服务,这些服务会fork出一个子进程来运行实际的服务,而父进程会立即退出。
systemd需要知道服务已经forked,因此需要在服务启动后发送一个SIGTERM信号来通知systemd。
- 适用于传统的Unix服务,这些服务会fork出一个子进程来运行实际的服务,而父进程会立即退出。
-
oneshot:
- 用于那些只执行一次的服务,比如某些初始化脚本。
systemd会在ExecStart命令执行完成后立即认为服务已经启动。
- 用于那些只执行一次的服务,比如某些初始化脚本。
-
dbus:
- 用于依赖于D-Bus的服务。
systemd会等待D-Bus上指定的名字出现后才认为服务已经启动。
- 用于依赖于D-Bus的服务。
-
notify:
- 类似于
simple,但是服务需要在启动后发送一个通知信号给systemd,告知它已经准备好接收请求。
- 类似于
-
idle:
- 服务只有在系统中没有其他任务执行时才会运行。
-
background:
- 类似于
simple,但是systemd会立即返回,不会等待服务的启动。
- 类似于
-
foreground:
- 服务必须保持在前台运行,类似于
simple,但是systemd会等待服务的控制终端变为前台进程。
- 服务必须保持在前台运行,类似于
了解这些Type类型及其适用场景,可以帮助你正确配置systemd服务,确保服务按照预期行为启动和运行。每种类型都有其特定的用途和配置要求,正确选择和配置Type对于服务的稳定性和可靠性至关重要。
sigterm信号
要快速掌握SIGTERM信号的80%使用场景,以下是最重要的20%知识点:
-
SIGTERM的定义:
SIGTERM(Signal Termination)信号是一个请求进程终止的信号。它是kill命令的默认信号,用于告诉进程优雅地结束。
-
SIGTERM的作用:
SIGTERM允许进程有机会执行清理操作,如关闭文件描述符、释放资源和保存状态,然后退出。
-
SIGTERM与SIGKILL的区别:
- 与
SIGKILL不同,SIGTERM是可以被捕获和处理的,允许进程有机会执行清理操作。SIGKILL是不能被捕获的,用于立即终止进程。
- 与
-
SIGTERM的默认行为:
- 如果进程没有处理
SIGTERM信号,其默认行为是终止进程,但不会生成core dump文件。
- 如果进程没有处理
-
处理SIGTERM信号:
- 进程可以通过定义信号处理函数来响应
SIGTERM信号,执行特定的清理代码后退出。
- 进程可以通过定义信号处理函数来响应
-
优雅关闭服务:
- 在许多Unix系统中,
init在关闭电源前会向所有不重要的进程发送SIGTERM,等待几秒后,再发送SIGKILL以强制终止剩余进程。
- 在许多Unix系统中,
-
编程中的SIGTERM处理:
- 在C/C++中,可以使用
signal()或sigaction()函数来设置SIGTERM的信号处理函数,例如:signal(SIGTERM, handler_function);。
- 在C/C++中,可以使用
-
守护进程中的SIGTERM:
- 守护进程通常会捕获
SIGTERM信号以优雅地关闭服务,执行必要的清理工作。
- 守护进程通常会捕获
掌握这些关键点,你将能够理解SIGTERM信号的重要性以及如何在实际应用中处理它,确保进程能够优雅地终止并进行适当的资源清理。
Linux信号
SIGTERM
中文名一般叫“终止信号”,用于终止进程。
SIGTERM最常见的一个应用场景是,执行命令 kill ,该命令会终止进程号为PID的进程。注意,这里kill没有-9之类的额外参数。
进程捕捉到SIGTERM信号后,通常会做些善后工作然后退出,这个过程通常被叫做“优雅退出”。当然,进程也可以不做任何处理,忽略该信号,继续运行下去。信号可能被忽略了,这就是为啥有时候kill 根本不起作用。
除了kill命令,SIGTERM还有很多其他使用场景。比如,docker stop、supervisorctl stop背后的实现机制就是给进程发送SIGTERM信号。
SIGKILL
SIGKILL,名字明显比SIGTERM霸气,字面意思就是“杀死”进程。最常见的应用场景就是大名鼎鼎的kill -9 命令。
SIGKILL最大的特点是,被杀的进程根本无法捕获处理该信号,操作系统会负责直接杀掉进程,进程没有任何反抗的余地。这个大杀器效果立竿见影,但是也有副作用,就是经常来不及做任何善后工作,可能引起数据丢失等问题。比如说,一个进程可能会把接收到的数据先临时放到内存里,攒到若干MB后再一次性写入磁盘,从而避免频繁的磁盘IO操作(比如迅雷就是这么干的),如果进程被突然杀掉,那么它根本来不及把内存里的数据写入磁盘,进而导致这些数据丢失。
SIGINT
SIGINT的字面意思是“打断”,和SIGTERM类似,区别在于,该信号通常被用于前台进程(可以简单理解为可以在shell上长期存在,不会后台运行的程序)。
当我们使用命令行程序时,按下CTRL + C时,进程便会收到SIGINT信号。一般进程会捕获处理这个命令并退出。当然,跟处理SIGTERM信号一样,进程也可以选择忽略信号并继续运行。
systemd中环境变量的问题
在处理systemd服务中的环境变量问题时,以下是最重要的20%知识点,可以帮助你快速理解和解决大部分问题:
-
使用
Environment指令设置环境变量:
在systemd的服务文件中,可以通过Environment指令直接设置环境变量。例如:[Service] Environment="PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"这样设置后,指定的变量将在服务启动时被设置。
-
使用
EnvironmentFile导入环境变量文件:
如果你有多个环境变量需要设置,可以使用EnvironmentFile指令指向一个包含环境变量的文件。该文件中的每行格式为VarName=VarValue。例如:[Service] EnvironmentFile=/etc/test_env_service/var_file其中
/etc/test_env_service/var_file文件包含:FILE_VAR1="Variable 1 from environment file" FILE_VAR2="Variable 2 from environment file"这样,文件中的变量将被导入到服务的环境中。
-
通过脚本来设置环境并启动服务:
另一种方法是编写一个包装脚本,在该脚本中设置所需的环境变量,然后启动服务。例如:#!/bin/bash export PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin exec /path/to/your/service然后在systemd服务文件中引用这个脚本:
[Service] ExecStart=/path/to/start-service.sh这样,当systemd启动服务时,实际上是启动了这个脚本。
-
理解systemd服务中的环境变量限制:
systemd启动的服务通常不会加载用户的环境变量,尤其是/etc/profile下的环境变量。因此,你需要在服务文件中明确设置所需的环境变量。 -
使用
systemctl edit进行配置覆盖:
为了避免修改原始的服务文件,可以使用systemctl edit <servicename>命令创建一个override文件,在其中设置环境变量。例如:[Service] Environment="Foo=bar"这将在
/etc/systemd/system/<servicename>.service.d/目录下创建一个override.conf文件,其中的设置将覆盖原始服务文件中的设置。
掌握这些关键点,你将能够有效地管理和解决systemd服务中的环境变量问题。
总结:
1、systemd是一个用来编写系统后台服务的工具
2、Unit是其服务单元,通常由.service文件,当然也有不同的服务类型
3、unit的文件分为几个段,来描述启动和停止命令,依赖等
4、systemctl status xx,xx是service的名字,来查看service的状态
相关文章:
Linux:systemd进程管理【1】
整体理解 要快速掌握Linux的systemd并覆盖80%的使用场景,以下是最重要的20%知识点: Systemd简介与核心功能: Systemd是一个系统和服务管理器,作为Linux系统的PID 1进程,负责启动和管理其他系统组件。它提供并行启动服…...
【Maven】继承和聚合
5. Maven的继承和聚合 5.1 什么是继承 Maven 的依赖传递机制可以一定程度上简化 POM 的配置,但这仅限于存在依赖关系的项目或模块中。当一个项目的多个模块都依赖于相同 jar 包的相同版本,且这些模块之间不存在依赖关系,这就导致同一个依赖…...
【线上问题记录 | 排查网络连接问题】
问题描述 现在有我们程序是部署在服务器A的,A链接的是B。程序从B的redis进行存储和取数据的。 我们的业务是: 信息展示,也就是如果发现机器有异常了,实时进行监控。突然发现有一天,信息显示延迟了。 然后我们就开始排查究竟什么原…...
springboot车辆管理系统设计与实现(代码+数据库+LW)
摘要 随着信息技术在管理上越来越深入而广泛的应用,管理信息系统的实施在技术上已逐步成熟。本文介绍了车辆管理系统的开发全过程。通过分析车辆管理系统管理的不足,创建了一个计算机管理车辆管理系统的方案。文章介绍了车辆管理系统的系统分析部分&…...
独家|京东调整职级序列体系
原有的M、P、T、S主序列将正式合并为新的专业主序列P。 作者|文昌龙 编辑|杨舟 据「市象」独家获悉,京东已在近日在内部宣布对职级序列体系进行调整,将原有的M、P、T、S主序列正式合并为新的专业主序列P,合并后的职级体系将沿用原有专业序…...
Arrays.copyOfRange(),System.arraycopy() 数组复制,数组扩容
Arrays.copyOfRange() 当需要将数组中的 长度扩容时, 数组复制 使用 需要用到Arrays 类提供的的 参数解析 * param original the array from which a range is to be copied * param from the initial index of the range to be copied, inclusive * param to the final ind…...
Python学习37天
# 魔术方法 # 创建类Monster,默认为object的子类 class Monster: name None age None gender None def __init__(self, name, age, gender): self.name name self.age age self.gender gender # 重写魔术方法__str__输出实例对象信息…...
flask的第一个应用
本文编写一个简单的实例来记录下flask的使用 文章目录 简单实例flask中的路由 简单实例 flask的依赖包都安装好之后,我们就可以写一个最简单的web应用程序了,我们把这个应用程序命名为first.py: from flask import Flaskapp Flask(__name__)app.route(/…...
【论文格式】同步更新中
1横向和纵向坐标的坐标密度不能太大,显示太多看起来不好看,本课题组采用emf,目前使用页面内紧凑,600dpi 2Force(kN):k小写 3涉及到变量的,变量本身斜体...
Java-GUI(登录界面示例)
简述: 步骤: (1)构造界面(将组件对象加入容器对象,注意:应设定对容器对象的布局策略) (2)为界面加入事件响应处理(如单击按钮) 实现: 两种方式实现,只有用户名为"admin"且密码为…...
看华为,引入IPD的正确路径
目录 前言 引发重视 作者简介 前言 华为将 IPD 的引入过程归结为三步: 先僵化、后优化、再固化。 如果只是单纯模仿,在不清楚底层逻辑的情况下, 就开始走先僵化的流程,去搞削足适履式的引入。 开始执行后,你就…...
计算机毕业设计Spark+大模型知识图谱中药推荐系统 中药数据分析可视化大屏 中药爬虫 机器学习 中药预测系统 中药情感分析 大数据毕业设计
温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:文末有 CSDN 平台官方提供的学长联系方式的名片! 作者简介:Java领…...
pcb线宽与电流
三十年一路高歌猛进的中国经济, 中国经历了几个三十年? 第一个三十年:以计划为导向。 第二个三十年:以经济为导向。 现在,第三个三十年呢? 应该是以可持续发展为导向。 传统企业摇摇欲坠, 新兴企…...
w~视觉~合集26
我自己的原文哦~ https://blog.51cto.com/whaosoft/12663170 #InternVL 本文设计了一个大规模的视觉-语言基础模型(InternVL),将视觉基础模型的参数扩展到60亿,并逐步与LLM对齐,利用来自不同来源的网络规模的图像-文…...
Qt支持RKMPP硬解的视频监控系统/性能卓越界面精美/实时性好延迟低/录像存储和回放/云台控制
一、前言 之前做的监控系统,已经实现了在windows上硬解码比如dxva2和d3d11va,后续又增加了linux上的硬解vdpau的支持,这几种方式都是跨系统的硬解实现方案,也是就是如果都是windows系统,无论X86还是ARM都通用…...
【Qt】图片绘制不清晰的问题
背景 实现一个图片浏览器,可以支持放大/缩小查看图片。主要组件如下: // canvaswidget.h #ifndef CANVASWIDGET_H #define CANVASWIDGET_H#include <QWidget>class CanvasWidget : public QWidget {Q_OBJECT public:explicit CanvasWidget(QImag…...
2008年IMO几何预选题第3题
设有两个圆凸内接四边形 A B Q D ABQD ABQD 和 B P Q C BPQC BPQC, 在线段 P Q PQ PQ 上存在一点 E E E, 使得, ∠ E A P ∠ E D Q \angle EAP\angle EDQ ∠EAP∠EDQ, ∠ E B P ∠ E C Q \angle EBP\angle ECQ ∠EBP∠ECQ. 求证: A A A, B B B, C C C, D D D 四点共…...
NAT拓展
NAT ALG(NAT应用级网) 为某些应用层协议,因为其报文内容可能携带IP相关信息,而普通NAT转化无法将这些IP转化,从而导致协议无法正常运行 例如FTP,DHCP,RSTP,ICMP,IPSEC…...
Flink四大基石之State
State state 可以理解为-- 历史计算结果 有状态计算和无状态计算 无状态计算: 不需要考虑历史数据, 相同的输入,得到相同的输出!如:map, 将每个单词记为1, 进来一个hello, 得到(hello,1),再进来一个hello,得到的还是(hello,1) 有状态计算: 需要考虑历史数据, 相同的输入,可…...
Spacy小笔记:zh_core_web_trf、zh_core_web_lg、zh_core_web_md 和 zh_core_web_sm区别
Spacy小笔记 最近频繁用到spacy,就小记一下。 2024.11.29 zh_core_web_trf、zh_core_web_lg、zh_core_web_md 和 zh_core_web_sm区别 首先,它们都是预训练的中文模型: zh_core_web_trf:395M 架构: 基于 Transformer 架构(bert…...
网络六边形受到攻击
大家读完觉得有帮助记得关注和点赞!!! 抽象 现代智能交通系统 (ITS) 的一个关键要求是能够以安全、可靠和匿名的方式从互联车辆和移动设备收集地理参考数据。Nexagon 协议建立在 IETF 定位器/ID 分离协议 (…...
stm32G473的flash模式是单bank还是双bank?
今天突然有人stm32G473的flash模式是单bank还是双bank?由于时间太久,我真忘记了。搜搜发现,还真有人和我一样。见下面的链接:https://shequ.stmicroelectronics.cn/forum.php?modviewthread&tid644563 根据STM32G4系列参考手…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
镜像里切换为普通用户
如果你登录远程虚拟机默认就是 root 用户,但你不希望用 root 权限运行 ns-3(这是对的,ns3 工具会拒绝 root),你可以按以下方法创建一个 非 root 用户账号 并切换到它运行 ns-3。 一次性解决方案:创建非 roo…...
MySQL中【正则表达式】用法
MySQL 中正则表达式通过 REGEXP 或 RLIKE 操作符实现(两者等价),用于在 WHERE 子句中进行复杂的字符串模式匹配。以下是核心用法和示例: 一、基础语法 SELECT column_name FROM table_name WHERE column_name REGEXP pattern; …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
20个超级好用的 CSS 动画库
分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码,而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库,可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画,可以包含在你的网页或应用项目中。 3.An…...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
淘宝扭蛋机小程序系统开发:打造互动性强的购物平台
淘宝扭蛋机小程序系统的开发,旨在打造一个互动性强的购物平台,让用户在购物的同时,能够享受到更多的乐趣和惊喜。 淘宝扭蛋机小程序系统拥有丰富的互动功能。用户可以通过虚拟摇杆操作扭蛋机,实现旋转、抽拉等动作,增…...
日常一水C
多态 言简意赅:就是一个对象面对同一事件时做出的不同反应 而之前的继承中说过,当子类和父类的函数名相同时,会隐藏父类的同名函数转而调用子类的同名函数,如果要调用父类的同名函数,那么就需要对父类进行引用&#…...
