当前位置: 首页 > news >正文

Linux 进程管理工具 Supervisor

介绍

Supervisor 是一个用 Python 编写的进程管理工具,旨在帮助你监控和控制多个进程。它特别适用于需要确保某些服务在服务器启动时自动运行,并且在崩溃时自动重启的场景。

写在前面:

因为现在很多第三方的包的最新版本都是基于 python3了,包括本文中提到的 setuptools。所以建议使用 python3 进行安装操作,否则可能会出现一系列缺包又难解决的问题!

安装 Supervisor

安装说明取决于您尝试在其上安装 Supervisor 的系统是否具有互联网访问权限。

联网在线安装

使用 Pip 进行在线安装

可以使用 pip install 来安装 Supervisor:

pip install supervisor

根据您系统 Python 的权限,您可能需要是 root 用户才能成功使用 pip 安装 Supervisor。

您也可以通过 pip 在 virtualenv 中安装 supervisor。

不使用 Pip 的在线安装

如果您的系统没有安装 pip,您将需要下载 Supervisor 发行版并通过手动方式安装。当前和以前版本的 Supervisor 可以从 PyPi 下载。解压软件包后,运行 python3 setup.py install。这需要互联网访问权限,它会下载并安装 Supervisor 所依赖的所有分发包,最后再安装 Supervisor 本身。

根据您系统 Python 的权限,您可能需要是 root 用户才能成功调用 python3 setup.py install

离线安装

如果您希望安装 Supervisor 的系统没有互联网访问权限,则需要稍微不同的方式进行安装。由于 pippython3 setup.py install 都依赖于互联网来执行依赖软件的下载,因此在未安装依赖项的情况下,两者都不会在没有互联网连接的机器上工作。要安装到没有互联网连接的机器上,在一台有互联网连接的机器上获取以下依赖项:

  • setuptools(最新版)来自 https://pypi.org/pypi/setuptools/。

将这些文件复制到可移动媒体,并将其放置在目标机器上。按照每个文件的说明在目标机器上安装它们。通常这意味着解压缩每个模块的文件并在解压缩目录中调用 python3 setup.py install。在所有依赖的模块都安装完成后,最后在 supervisor 目录中运行 python3 setup.py install

根据您系统 Python 的权限,您可能需要是 root 用户才能为每个包成功调用 python3 setup.py install

创建配置文件

一旦Supervisor安装完成,运行echo_supervisord_conf。这将打印一个“示例”Supervisor配置文件到您的终端的标准输出。

当您看到文件被显示在终端上时,重新输入命令echo_supervisord_conf > /etc/supervisor/supervisord.conf。如果您没有root权限,此命令将无法工作。

如果您没有root权限,或者您不希望将supervisord.conf文件放置在/etc/supervisor/supervisord.conf,您可以将其放在当前目录下(通过运行echo_supervisord_conf > supervisord.conf),并在启动supervisord时使用-c标志来指定配置文件的位置。

例如,使用supervisord -c supervisord.conf。如果配置文件在当前执行命令的目录中,使用-c标志实际上是多余的,因为supervisord 会先在当前目录下搜索supervisord.conf文件,如果当前目录不存在配置文件,会默认读取 /etc/supervisor/supervisord.conf 配置文件(这个默认的配置文件位置从 3.3.0 版本开始)。

配置文件解释说明如下:

; 示例 supervisor 配置文件。
;
; 有关配置文件的更多信息,请参阅:
; http://supervisord.org/configuration.html
;
; 注意事项:
;  - 不支持 Shell 扩展(如 "~""$HOME")。环境变量可通过语法 "%(ENV_HOME)s" 扩展。
;  - 除下方 environment= 选项外,其他值不支持引号包裹。
;  - 注释必须以空格开头,例如:"a=b ;注释" 有效,而 "a=b;注释" 无效。
;  - 若命令类似配置文件注释会被截断。例如:"command=bash -c 'foo ; bar'" 会被截断为 "command=bash -c 'foo ";
; 警告:
;  此示例文件中多处使用 /tmp 路径,因大多数系统支持该路径。实际使用时请替换为更合适的路径。
;  部分系统会定期清理 /tmp 中的旧文件。特别注意:若下方 [unix_http_server] 中定义的 socket 文件被删除,
;  supervisorctl 将无法连接 supervisord。[unix_http_server]
file=/tmp/supervisor.sock   ; socket 文件路径
;chmod=0700                 ; socket 文件权限(默认 0700)
;chown=nobody:nogroup       ; socket 文件所属用户:组
;username=user              ; 用户名(默认无认证)
;password=123               ; 密码(默认无认证); 安全警告:
;  默认不启用 inet HTTP 服务器。取消下方 [inet_http_server] 的注释以启用。
;  inet HTTP 服务器仅限可信环境使用,应绑定到 localhost 或隔离的信任网络。
;  inet HTTP 服务器不支持加密,默认无认证(可通过 username=password= 添加认证)。
;  切勿将 inet HTTP 服务器暴露到公网。;[inet_http_server]         ; 默认禁用 inet (TCP) 服务器
;port=127.0.0.1:9001        ; 监听地址:端口(*:port 表示所有接口)
;username=user              ; 用户名(默认无认证)
;password=123               ; 密码(默认无认证)[supervisord]
logfile=/tmp/supervisord.log ; 主日志文件路径(默认 $CWD/supervisord.log)
logfile_maxbytes=50MB        ; 日志文件最大大小(默认 50MB)
logfile_backups=10           ; 日志备份数量(0 表示不备份,默认 10loglevel=info                ; 日志级别(默认 info;可选 debug,warn,trace)
pidfile=/tmp/supervisord.pid ; PID 文件路径(默认 supervisord.pid)
nodaemon=false               ; 是否前台运行(true 前台运行,默认 false)
silent=false                 ; 是否禁止日志输出到 stdout(默认 false)
minfds=1024                  ; 所需最小可用文件描述符(默认 1024minprocs=200                 ; 所需最小进程描述符(默认 200;umask=022                   ; 进程文件创建 umask(默认 022)
;user=supervisord            ; 启动时切换至此用户(建议以 root 运行时设置)
;identifier=supervisor       ; 唯一标识符(默认 'supervisor';directory=/tmp              ; 启动时切换至此目录(默认不切换)
;nocleanup=true              ; 启动时不清理临时文件(默认 false)
;childlogdir=/tmp            ; 子进程日志目录(默认 $TEMP;environment=KEY="value"     ; 环境变量键值对
;strip_ansi=false            ; 是否去除日志中的 ANSI 转义码(默认 false); [rpcinterface:supervisor] 必须保留以支持 RPC(supervisorctl/web 接口)
; 可通过定义 [rpcinterface:x] 添加其他接口[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface; [supervisorctl] 配置连接 supervisord 的方式
; 需与 [unix_http_server][inet_http_server] 配置匹配[supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; 使用 unix:// URL 连接 unix socket
;serverurl=http://127.0.0.1:9001      ; 使用 http:// URL 连接 inet socket
;username=chris              ; 需与 [*_http_server] 中的用户名一致
;password=123                ; 需与 [*_http_server] 中的密码一致
;prompt=mysupervisor         ; 命令行提示符(默认 "supervisor";history_file=~/.sc_history  ; 使用 readline 历史记录(若可用); 以下 [program:theprogramname] 示例展示了所有可用的程序配置项
; 创建实际的 [program:x] 段落后,即可通过 supervisor 管理对应进程;[program:theprogramname]
;command=/bin/cat              ; 要执行的命令(相对路径使用环境变量 PATH,可以带参数)
;process_name=%(program_name)s ; 进程名表达式(默认 %(program_name)s)
;numprocs=1                    ; 启动的进程副本数(默认 1;directory=/tmp                ; 执行前切换至此目录(默认不切换)
;umask=022                     ; 进程 umask(默认 None)
;priority=999                  ; 启动优先级(默认 999;autostart=true                ; 随 supervisord 启动(默认 true)
;startsecs=1                   ; 进程持续运行至少多少秒才认为启动成功(默认 1;startretries=3                ; 启动失败后的最大重试次数(默认 3;autorestart=unexpected        ; 退出后自动重启策略(默认 unexpected)
;exitcodes=0                   ; autorestart 视为成功的退出码(默认 0;stopsignal=QUIT               ; 终止进程的信号(默认 TERM;stopwaitsecs=10               ; 发送 SIGKILL 前的等待秒数(默认 10;stopasgroup=false             ; 是否向进程组发送停止信号(默认 false)
;killasgroup=false             ; 是否向进程组发送 SIGKILL(默认 false)
;user=chrism                   ; 运行此进程的用户身份
;redirect_stderr=true          ; 是否将 stderr 重定向到 stdout(默认 false)
;stdout_logfile=/a/path        ; stdout 日志路径(NONE 表示不记录;默认 AUTO)
;stdout_logfile_maxbytes=1MB   ; stdout 日志最大大小(默认 50MB)
;stdout_logfile_backups=10     ; stdout 日志备份数(0 表示无备份,默认 10;stdout_capture_maxbytes=1MB   ; 捕获模式下的最大字节数(默认 0;stdout_events_enabled=false   ; 是否触发 stdout 写入事件(默认 false)
;stdout_syslog=false           ; 是否将 stdout 发送到 syslog(默认 false)
;stderr_logfile=/a/path        ; stderr 日志路径(NONE 表示不记录;默认 AUTO)
;stderr_logfile_maxbytes=1MB   ; stderr 日志最大大小(默认 50MB)
;stderr_logfile_backups=10     ; stderr 日志备份数(0 表示无备份,默认 10;stderr_capture_maxbytes=1MB   ; 捕获模式下的最大字节数(默认 0;stderr_events_enabled=false   ; 是否触发 stderr 写入事件(默认 false)
;stderr_syslog=false           ; 是否将 stderr 发送到 syslog(默认 false)
;environment=A="1",B="2"       ; 环境变量键值对(默认不添加)
;serverurl=AUTO                ; 覆盖 serverurl 计算逻辑(childutils); 以下 [eventlistener:theeventlistenername] 示例展示了所有事件监听器配置项
; 创建实际的 [eventlistener:x] 段落后,即可处理 supervisord 发送的事件通知;[eventlistener:theeventlistenername]
;command=/bin/eventlistener    ; 要执行的命令(相对路径使用环境变量 PATH,可以带参数)
;process_name=%(program_name)s ; 进程名表达式(默认 %(program_name)s)
;numprocs=1                    ; 启动的进程副本数(默认 1;events=EVENT                  ; 订阅的事件类型(必须设置)
;buffer_size=10                ; 事件缓冲区队列大小(默认 10;directory=/tmp                ; 执行前切换至此目录(默认不切换)
;umask=022                     ; 进程 umask(默认 None)
;priority=-1                   ; 启动优先级(默认 -1)
;autostart=true                ; 随 supervisord 启动(默认 true)
;startsecs=1                   ; 进程持续运行至少多少秒才认为启动成功(默认 1;startretries=3                ; 启动失败后的最大重试次数(默认 3;autorestart=unexpected        ; 退出后自动重启策略(默认 unexpected)
;exitcodes=0                   ; autorestart 视为成功的退出码(默认 0;stopsignal=QUIT               ; 终止进程的信号(默认 TERM;stopwaitsecs=10               ; 发送 SIGKILL 前的等待秒数(默认 10;stopasgroup=false             ; 是否向进程组发送停止信号(默认 false)
;killasgroup=false             ; 是否向进程组发送 SIGKILL(默认 false)
;user=chrism                   ; 运行此进程的用户身份
;redirect_stderr=false         ; 事件监听器不允许 redirect_stderr=true
;stdout_logfile=/a/path        ; stdout 日志路径(NONE 表示不记录;默认 AUTO)
;stdout_logfile_maxbytes=1MB   ; stdout 日志最大大小(默认 50MB)
;stdout_logfile_backups=10     ; stdout 日志备份数(0 表示无备份,默认 10;stdout_events_enabled=false   ; 是否触发 stdout 写入事件(默认 false)
;stdout_syslog=false           ; 是否将 stdout 发送到 syslog(默认 false)
;stderr_logfile=/a/path        ; stderr 日志路径(NONE 表示不记录;默认 AUTO)
;stderr_logfile_maxbytes=1MB   ; stderr 日志最大大小(默认 50MB)
;stderr_logfile_backups=10     ; stderr 日志备份数(0 表示无备份,默认 10;stderr_events_enabled=false   ; 是否触发 stderr 写入事件(默认 false)
;stderr_syslog=false           ; 是否将 stderr 发送到 syslog(默认 false)
;environment=A="1",B="2"       ; 环境变量键值对
;serverurl=AUTO                ; 覆盖 serverurl 计算逻辑(childutils); 以下 [group:thegroupname] 示例展示了组配置项
; 创建实际的 [group:x] 段落后,可管理异构进程组;[group:thegroupname]
;programs=progname1,progname2  ; 包含的进程列表(对应 [program:x] 中的 x)
;priority=999                  ; 启动优先级(默认 999; [include] 用于引入其他配置文件
; files 设置支持通配符,路径相对于本文件。被引入的文件不能再引入其他文件;[include]
;files = relative/directory/*.ini

一旦您的文件系统中有了基础配置文件,接下来就可以创建并配置程序了。

Supervisor的启动和停止

  • 启动Supervisor服务
supervisord -c /etc/supervisor/supervisord.conf
  • 停止Supervisor服务
supervisorctl shutdown
  • 重新完全加载Supervisor配置文件(如果希望完全重启服务,先shutdown再启动服务)
supervisorctl reload

配置Supervisor

Supervisor 的主要配置文件位于 /etc/supervisor/supervisord.conf。所有程序的配置集中放在 /etc/supervisor/conf.d/ 目录中。

添加程序配置

Supervisor 会读取 /etc/supervisor/conf.d/ 目录下的所有 .conf 文件。你可以在这个目录下创建一个新的配置文件来定义你的程序。

例如,创建一个名为 myapp.conf 的文件:

[program:myapp]
directory=/path/to/myapp
command=/usr/bin/python3 /path/to/myapp/main.py
user=myuser
autostart=true
autorestart=true
stderr_logfile=/var/log/myapp.err.log
stdout_logfile=/var/log/myapp.out.log

常见配置项解释

  • [program:myapp]:定义一个名为 myapp 的程序。
  • directory:指定程序的工作目录。
  • command:指定要执行的命令。
  • user:指定以哪个用户身份运行该程序。
  • autostart:指定在 Supervisor 启动时是否自动启动该程序。
  • autorestart:指定在程序退出时是否自动重启。
  • stderr_logfilestdout_logfile:指定标准错误输出和标准输出日志文件的路径。

加载新的配置

每次修改配置文件后,需要重新加载 Supervisor 配置:

sudo supervisorctl reread
sudo supervisorctl update

如果你在配置文件中添加了新的程序或组,update 会启动这些新定义的程序。
如果你修改了现有程序的配置(如改变了命令行参数、工作目录等),update 会停止并重新启动受影响的程序以应用更改。
如果你从配置文件中删除了某个程序或组,update 会停止并移除这些不再需要管理的程序。

管理进程

使用 supervisorctl 管理

使用 supervisorctl 命令可以方便地启动、停止和重启程序。

  • 启动程序:

    sudo supervisorctl start myapp
    
  • 停止程序:

    sudo supervisorctl stop myapp
    
  • 重启程序:

    sudo supervisorctl restart myapp
    
  • 查看状态:

    sudo supervisorctl status
    

Web 管理界面

Supervisor 提供了一个简单的 Web 界面,可以帮助你更直观地管理和监控进程。

  1. 启用 Web 管理界面

    编辑 /etc/supervisor/supervisord.conf 文件,取消 [inet_http_server] 部分的注释,并设置监听地址和端口:

    [inet_http_server]
    port=127.0.0.1:9001 ; (ip_address:port specifier, *:port for all iface)
    username=user     ; (default is no username (open server))
    password=123      ; (default is no password (open server))
    

需要特别注意的是:如果你希望在电脑上可以远程访问这个web界面,请需要将 127.0.0.1:9001 修改为 *:9001,否则只能在服务器自身通过 http://127.0.0.1:9001 访问。

  1. 重启 Supervisor

    sudo supervisord reload
    
  2. 访问 Web 界面

    打开浏览器并访问 http://127.0.0.1:9001,输入用户名和密码登录即可查看和管理进程。

常见问题

如何调试 Supervisor?

你可以通过增加日志级别来获取更多的调试信息。在 supervisord.conf 中设置:

[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
loglevel=debug                   ; (log level;default info; others: debug,warn,trace)

然后重新加载 Supervisor:

sudo supervisorctl reload

官方资料

  • Supervisor 官网
  • Supervisor GitHub

通过以上步骤,你可以有效地使用 Supervisor 来管理和监控你的应用程序。希望这篇文章能帮助你更好地理解和应用 Supervisor。


(END)

相关文章:

Linux 进程管理工具 Supervisor

介绍 Supervisor 是一个用 Python 编写的进程管理工具,旨在帮助你监控和控制多个进程。它特别适用于需要确保某些服务在服务器启动时自动运行,并且在崩溃时自动重启的场景。 写在前面: 因为现在很多第三方的包的最新版本都是基于 python3了…...

问题解决:AttributeError: ‘NoneType‘ object has no attribute ‘text‘

项目环境: 我的环境:Window10,Python3.12,Anaconda3,Pycharm2024.3.4 问题描述: 找不到’text’这个对象 部分代码: Traceback (most recent call last):File "D:\IT DateFiles\PyDate\FQ…...

Hadoop、Hive、Spark的关系

Part1:Hadoop、Hive、Spark关系概览 1、MapReduce on Hadoop 和spark都是数据计算框架,一般认为spark的速度比MR快2-3倍。 2、mapreduce是数据计算的过程,map将一个任务分成多个小任务,reduce的部分将结果汇总之后返回。 3、HIv…...

OneM2M:全球性的物联网标准-可应用于物联网中

OneM2M 是一个全球性的物联网(IoT)标准,旨在为物联网设备和服务提供统一的框架和接口,以实现设备之间的互操作性、数据共享和服务集成。OneM2M 由多个国际标准化组织(如 ETSI、TIA、TTC、ARIB 等)共同制定,目标是解决物联网领域的碎片化问题,提供一个通用的标准,支持跨…...

C++类和对象入门(三)

目录 前言 一、初始化列表 1.1定义 1.2 格式和语法 1.3与在函数内初始化的区别 1.4使用初始化列表的必要性 1.5成员变量默认值的使用(C11) 1.6初始化的先后顺序 1.7初始化列表的总结 二、类型转换 2.1内置类型转化成类类型 2.2类类型之间的相…...

Ubuntu 下 Docker 企业级运维指南:核心命令与最佳实践深度解析20250309

Ubuntu 下 Docker 企业级运维指南:核心命令与最佳实践深度解析 在当今的数字化时代,Docker 已成为企业应用部署和运维的基石。其轻量级、高效且灵活的容器化技术,为企业带来了前所未有的敏捷性和可扩展性。然而,随着容器化应用的…...

Tensorflow 2.0 GPU的使用与限制使用率及虚拟多GPU

Tensorflow 2.0 GPU的使用与限制使用率及虚拟多GPU 1. 获得当前主机上特定运算设备的列表2. 设置当前程序可见的设备范围3. 显存的使用4. 单GPU模拟多GPU环境 先插入一行简单代码,以下复制即可用来设置GPU使用率: import tensorflow as tf import numpy…...

【PyCharm】Python和PyCharm的相互关系和使用联动介绍

李升伟 整理 Python 是一种广泛使用的编程语言,而 PyCharm 是 JetBrains 开发的专门用于 Python 开发的集成开发环境(IDE)。以下是它们的相互关系和使用联动的介绍: 1. Python 和 PyCharm 的关系 Python:一种解释型、…...

动态规划:多重背包

本题力扣上没有原题,大家可以去卡码网第56题 (opens new window)去练习,题意是一样的。 56. 携带矿石资源(第八期模拟笔试) 题目描述 你是一名宇航员,即将前往一个遥远的行星。在这个行星上,有许多不同类…...

AI编程: 一个案例对比CPU和GPU在深度学习方面的性能差异

背景 字节跳动正式发布中国首个AI原生集成开发环境工具(AI IDE)——AI编程工具Trae国内版。 该工具模型搭载doubao-1.5-pro,支持切换满血版DeepSeek R1&V3, 可以帮助各阶段开发者与AI流畅协作,更快、更高质量地完…...

TensorFlow 的基本概念和使用场景

TensorFlow 是一个由 Google 开发的开源深度学习框架,用于构建和训练机器学习模型。它的基本概念包括以下几点: 张量(Tensor):在 TensorFlow 中,数据以张量的形式表示,张量可以是多维数组&#…...

gRPC学习笔记

微服务 一旦某个服务器宕机,会引起整个应用不可用,隔离性差 只能整体应用进行伸缩,浪费资源,可伸缩性差 代码耦合在一起,可维护性差 微服务架构:解决了单体架构的弊端 可以按照服务进行单独扩容 各个…...

Linux常见指令

Linux常见指令 1、ls指令2、pwd命令3、cd指令4、touch指令5、mkdir指令6、rmdir指令和rm指令7、man指令8、cp指令9、mv指令10、cat指令11、重定向12、more指令13、less指令14、head指令15、tail指令16、管道17、时间相关指令18、cal指令19、find指令20、grep指令21、zip/unzip指…...

Vue3、vue学习笔记

<!-- Vue3 --> 1、Vue项目搭建 npm init vuelatest cd 文件目录 npm i npm run dev // npm run _ 这个在package.json中查看scripts /* vue_study\.vscode可删 // vue_study\src\components也可删除(基本语法&#xff0c;不使用组件) */ // vue_study\.vscode\lau…...

用OpenCV写个视频播放器可还行?(C++版)

引言 提到OpenCV&#xff0c;大家首先想到的可能是图像处理、目标检测&#xff0c;但你是否想过——用OpenCV实现一个带进度条、倍速播放、暂停功能的视频播放器&#xff1f;本文将通过一个实战项目&#xff0c;带你深入掌握OpenCV的视频处理能力&#xff0c;并解锁以下功能&a…...

clion+arm-cm3+MSYS-mingw +jlink配置用于嵌入式开发

0.前言 正文可以跳过这段 初识clion&#xff0c;应该是2015年首次发布的时候&#xff0c; 那会还是大三&#xff0c;被一则推介广告吸引到&#xff0c;当时还在用vs studio&#xff0c;但是就喜欢鼓捣新工具&#xff0c;然后下载安装试用了clion&#xff0c;但是当时对cmake规…...

物联网-IoTivity:开源的物联网框架

IoTivity 是一个开源的物联网(IoT)框架,旨在为物联网设备提供互操作性、安全性和可扩展性。它由 Open Connectivity Foundation (OCF) 主导开发,遵循 OCF 的标准,致力于实现设备之间的无缝连接和通信。IoTivity 提供了一个统一的框架,支持设备发现、数据交换、设备管理和…...

Acrobat DC v25.001 最新专业版已破,像word一样编辑PDF!

在数字化时代&#xff0c;PDF文件以其稳定性和通用性成为了文档交流和存储的热门选择。无论是阅读、编辑、转换还是转曲&#xff0c;大家对PDF文件的操作需求日益增加。因此&#xff0c;一款出色的PDF处理软件不仅要满足多样化的需求&#xff0c;还要通过简洁的界面和强大的功能…...

【c++】模板进阶

在前面我们学习了模板的基础用法【c】 模板初阶-CSDN博客初步认识了函数模板和类模板&#xff0c;接下来让我们看看模板还有哪些进阶的应用。 非类型模板参数 之前我们用到的模板全都使用了类型参数 类型参数&#xff1a;表示某种数据类型&#xff08;如 int、double、自定义…...

IntelliJ IDEA 2021版创建springboot项目的五种方式

第一种方式&#xff0c;通过https://start.spring.io作为spring Initializr的url来创建项目。 第二种方式&#xff0c;通过https://start.spring.io官网来直接创建springboot项目压缩包&#xff0c;然后导入至我们的idea中。 点击generate后&#xff0c;即可生成压缩包&#xf…...

数字信号处理之信号功率谱计算welch方法(分段加窗平均周期图)、Bartlett方法(周期图)(Python)

welch方法原理说明 welch方法[1]通过将数据划分为重叠的段&#xff0c;计算每个段的进行修改(加窗)后的周期图&#xff0c;然后对所有段的周期图求和进行平均&#xff0c;得到最终的功率谱密度。 Python和Matlab中均存在welch函数。welch函数通过配置noverlap为0&#xff0c;可…...

【面试】Java 基础

基础 1、Java 中几种基本数据类型什么&#xff0c;各自占用多少字节2、基本数据同包装类的区别3、Java 基本类型的参数传递和引用类型的参数传递有啥区别4、隐式类型转换和显式类型转换5、switch 语句表达式结果的类型6、数组的扩容方式7、面向对象三大特征8、静态变量和成员变…...

【工具使用】IDEA 社区版如何创建 Spring Boot 项目(详细教程)

IDEA 社区版如何创建 Spring Boot 项目&#xff08;详细教程&#xff09; Spring Boot 以其简洁、高效的特性&#xff0c;成为 Java 开发的主流框架之一。虽然 IntelliJ IDEA 专业版提供了Spring Boot 项目向导&#xff0c;但 社区版&#xff08;Community Edition&#xff09…...

CTFHub-FastCGI协议/Redis协议

将木马进行base64编码 <?php eval($_GET[cmd]);?> 打开kali虚拟机&#xff0c;使用虚拟机中Gopherus-master工具 Gopherus-master工具安装 git clone https://github.com/tarunkant/Gopherus.git 进入工具目录 cd Gopherus 使用工具 python2 "位置" --expl…...

【Python字符串】\n是什么?它与raw字符串、多行字符串的运用有什么关系?

李升伟 整理 在Python中&#xff0c;\n 是换行符&#xff0c;用于在字符串中表示新的一行。当你在字符串中使用 \n 时&#xff0c;Python 会在该位置插入一个换行符&#xff0c;使得输出在 \n 处换行。 1. 普通字符串中的 \n 在普通字符串中&#xff0c;\n 会被解释为换行符…...

Linux 配置静态 IP

一、简介 在 Linux CentOS 系统中默认动态分配 IP 地址&#xff0c;每次启动虚拟机服务都是不一样的 IP&#xff0c;因此要配置静态 IP 地址避免每次都发生变化&#xff0c;下面将介绍配置静态 IP 的详细步骤。 首先先理解一下动态 IP 和静态 IP 的概念&#xff1a; 动态 IP…...

git lfs使用方法指南【在github保存100M以上大文件】

为了在 GitHub 仓库中存储超过 100MB 的大文件并避免推送失败&#xff0c;使用 Git LFS&#xff08;Large File Storage&#xff09; 是最佳解决方案。以下是详细步骤&#xff1a; 一、安装 Git LFS 下载并安装 Git LFS&#xff1a; 访问 Git LFS 官网 下载对应系统的安装包。或…...

【Linux】初识线程

目录 一、什么是线程&#xff1a; 重定义线程和进程&#xff1a; 执行流&#xff1a; Linux中线程的实现方案&#xff1a; 二、再谈进程地址空间 三、小结&#xff1a; 1、概念&#xff1a; 2、进程与线程的关系&#xff1a; 3、线程优点&#xff1a; 4、线程…...

【Linux学习笔记】Linux基本指令分析和权限的概念

【Linux学习笔记】Linux基本指令分析和权限的概念 &#x1f525;个人主页&#xff1a;大白的编程日记 &#x1f525;专栏&#xff1a;Linux学习笔记 文章目录 【Linux学习笔记】Linux基本指令分析和权限的概念前言一. 指令的分析1.1 alias 指令1.2 grep 指令1.3 zip/unzip 指…...

uniapp登录用户名在其他页面都能响应

使用全局变量 1、在APP.vue中定义一个全局变量&#xff0c;然后在需要的地方引用它&#xff1b; <script>export default {onLaunch: function() {console.log(App Launch)this.globalData { userInfo: {} };},onShow: function() {console.log(App Show)},onHide: fu…...

ESP8266 入门(第 2 部分):使用 AT 命令

使用 AT 命令对 WiFi 收发器ESP8266编程 本教程是上一个教程 ESP8266 入门(第 1 部分)的延续。因此,简单回顾一下,在之前的教程中,我们介绍了 ESP 模块,并学习了一些基础知识。我们还使用 FTDI 串行适配器模块制作了一个开发板,该模块可以很容易地用于使用 AT 命令和 A…...

介绍一下Qt 中的QSizePolicy 布局策略

在 Qt 中&#xff0c;QSizePolicy 类用于描述一个控件在布局中如何分配空间&#xff0c;它定义了控件在水平和垂直方向上对空间的需求和响应策略。以下是对 QSizePolicy 策略的详细介绍&#xff1a; 基本概念 QSizePolicy 包含两个主要的属性&#xff1a;Policy&#xff08;策…...

从ETL到数仓分层:大数据处理的“金字塔”构建之道

在当今数据驱动的时代&#xff0c;大数据处理已成为企业决策和业务优化的核心。而ETL&#xff08;Extract, Transform, Load&#xff09;作为数据处理的基石&#xff0c;其背后的数仓分层理念更是决定了数据处理的效率与质量。本文将深入探讨ETL工作中的数仓分层理念&#xff0…...

springBoot集成声明式和编程式事务的方式

一、声明式事务 前提集成了mybatisplus插件 1、pom依赖 <dependencies><!-- MyBatis-Plus 启动器 --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.3.4&l…...

前端实现版本更新自动检测✅

&#x1f916; 作者简介&#xff1a;水煮白菜王&#xff0c;一位资深前端劝退师 &#x1f47b; &#x1f440; 文章专栏&#xff1a; 前端专栏 &#xff0c;记录一下平时在博客写作中&#xff0c;总结出的一些开发技巧和知识归纳总结✍。 感谢支持&#x1f495;&#x1f495;&a…...

Python零基础学习第三天:函数与数据结构

一、函数基础 函数是什么&#xff1f; 想象你每天都要重复做同一件事&#xff0c;比如泡咖啡。函数就像你写好的泡咖啡步骤说明书&#xff0c;每次需要时直接按步骤执行&#xff0c;不用重新想流程。 # 定义泡咖啡的函数 def make_coffee(sugar1): # 默认加1勺糖 print("…...

深入了解Linux —— 调试程序

前言 我们已经学习了linux下许多的工具&#xff0c;vim、gcc、make/makefile等&#xff1b; 已经能够在linux写代码&#xff0c;并且进行编译运行&#xff0c;让程序在linux下跑起来。 但是&#xff0c;如果我们在写代码的时候遇见了错误&#xff1b;但是我们并不知道错误在哪&…...

解决VScode 连接不上问题

问题 &#xff1a;VScode 连接不上 解决方案&#xff1a; 1、手动杀死VS Code服务器进程&#xff0c;然后重新尝试登录 打开xshell &#xff0c;远程连接服务器 &#xff0c;查看vscode的进程 &#xff0c;然后全部杀掉 [cxqiZwz9fjj2ssnshikw14avaZ ~]$ ps ajx | grep vsc…...

行式数据库与列式数据库区别

列式数据库&#xff08;Columnar Database&#xff09;和行式数据库&#xff08;Row-based Database&#xff09;是两种不同的数据存储和检索方式&#xff0c;它们在数据组织、存储结构和适用场景上有显著区别。以下是对两者的详细对比&#xff1a; 1. 数据存储方式 行式数据库…...

如何将本地已有的仓库上传到gitee (使用UGit)

1、登录Gitee。 2、点击个人头像旁边的加号&#xff0c;选择新建仓库&#xff1a; 3、填写仓库相关信息 4、复制Gitee仓库的地址 5、绑定我们的本地仓库与远程仓库 6、将本地仓库发布&#xff08;推送&#xff09;到远程仓库&#xff1a; 注意到此处报错&#xff…...

FIWARE:开源的物联网平台,支持设备虚拟化和数据管理

FIWARE 是一个开源的物联网(IoT)平台,旨在为物联网应用提供强大的数据管理和设备虚拟化功能。FIWARE 提供了一系列通用的 API 和组件,支持设备管理、数据采集、数据处理、数据共享和安全通信等功能,使得开发者能够快速构建和扩展物联网解决方案。以下是 FIWARE 的核心功能…...

RISC-V汇编学习(三)—— RV指令集

有了前两节对于RISC-V汇编、寄存器、汇编语法等的认识&#xff0c;本节开始介绍RISC-V指令集和伪指令。 前面说了RISC-V的模块化特点&#xff0c;是以RV32I为作为ISA的核心模块&#xff0c;其他都是要基于此为基础&#xff0c;可以这样认为&#xff1a;RISC-V ISA 基本整数指…...

【Linux】冯诺依曼体系与操作系统理解

&#x1f31f;&#x1f31f;作者主页&#xff1a;ephemerals__ &#x1f31f;&#x1f31f;所属专栏&#xff1a;Linux 目录 前言 一、冯诺依曼体系结构 二、操作系统 1. 操作系统的概念 2. 操作系统存在的意义 3. 操作系统的管理方式 4. 补充&#xff1a;理解系统调用…...

Android15使用FFmpeg解码并播放MP4视频完整示例

效果: 1.编译FFmpeg库: 下载FFmpeg-kit的源码并编译生成安装平台库 2.复制生成的FFmpeg库so文件与包含目录到自己的Android下 如果没有prebuiltLibs目录,创建一个,然后复制 包含目录只复制arm64-v8a下...

音视频入门基础:RTP专题(16)——RTP封装音频时,音频的有效载荷结构

一、引言 《RFC 3640》和《RFC 6416》分别定义了两种对MPEG-4流的RTP封包方式&#xff0c;这两个文档都可以从RFC官网下载&#xff1a; RFC Editor 本文主要对《RFC 3640》中的音频打包方式进行简介。《RFC 3640》总共有43页&#xff0c;本文下面所说的“页数”是指在pdf阅读…...

3.3.2 Proteus第一个仿真图

文章目录 文章介绍0 效果图1 新建“点灯”项目2 添加元器件3 元器件布局接线4 补充 文章介绍 本文介绍&#xff1a;使用Proteus仿真软件画第一个仿真图 0 效果图 1 新建“点灯”项目 修改项目名称和路径&#xff0c;之后一直点“下一步”直到完成 2 添加元器件 点击元…...

MySQL创建数据库和表,插入四大名著中的人物

一、登录数据库并创建数据库db_ck 二、创建表t_hero 表属性包括&#xff08;id&#xff0c;name&#xff0c;nickname&#xff0c;age&#xff0c;gender&#xff0c;address&#xff0c;weapon&#xff0c;types&#xff09; mysql> create table t_hero(-> id int,-…...

matlab和FPGA联合仿真时读写.txt文件数据的方法

在FPGA开发过程中&#xff0c;往往需要将MATLAB生成的数据作为原始激励灌入FPGA进行仿真。为了验证FPGA计算是否正确&#xff0c;又需要将FPGA计算结果导入MATLAB绘图与MATLAB计算结果对比。 下面是MATLAB“写.txt”、“读.txt”&#xff0c;Verilog“读.txt”、“写.txt”的代…...

C++修炼之路:初识C++

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》 欢迎点赞&#xff0c;关注&#xff01; 引言 …...

ACE协议学习1

在多核系统或复杂SoC&#xff08;System on Chip&#xff09;中&#xff0c;不同处理器核心或IP&#xff08;Intellectual Property&#xff09;模块之间需要保持数据的一致性。常用的是ACE协议or CHI。 先对ACE协议进行学习 ACE协议&#xff08;Advanced Microcontroller Bu…...