首页 > 系统相关 >Supervisor 进程管理

Supervisor 进程管理

时间:2023-09-25 22:44:12浏览次数:43  
标签:supervisor supervisord 管理 default supervisorctl 进程 Supervisor false

Supervisor进程管理

概述:supervisor 是一个用 python 语言编写的进程管理工具,它可以很方便的监听、启动、停止、重启一个或多个进程。当一个进程意外被杀死,supervisor 监听到进程死后,可以很方便的让进程自动恢复,不再需要程序员或系统管理员自己编写代码来控制。

1.构成要素

  • Supervisord:

    • supervisor的服务端:运行supervisor时会启动一个进程supervisord;
    • 它负责启动所管理的进程,并将所管理的进程作为自己的子进程来启动;
    • 而且可以在所管理的进程出现崩溃时自动重启;
  • supervisorctl

    • supervisor 的客户端:supervisorctl 是命令行管理工具,可以用命令来进行子进程的管理

    • supervisorctl 常见命令

      命令 含义
      supervisorctl status 查看所有子进程的服务状态
      supervisorctl restart 重启所有子进程服务
      supervisorctl restart name 重启子进程名字为 name 的服务
      supervisorctl start name 开启子进程为 name 的服务
      supervisorctl stop all 关闭所有子进程服务
      supervisorctl stop name 停止子进程为 name 的服务
      supervisorctl shutdown 关闭所有的子进程服务,同时关闭supervisor工具本身
      supervisorctl reload 重载配置文件,重启所有子进程服务
      supervisorctl update 更新所有服务,一般用在添加新服务后
      supervisorctl update name 更新子进程名字为 name 的服务
  • echo_supervisord_conf

    • echo_supervisord_conf是Supervisor的一个内置命令,用于生成Supervisor配置文件的模板。使用该命令可以快速生成一个示例的Supervisor配置文件,然后根据需要进行修改和扩展。

    • 要使用echo_supervisord_conf命令,您需要执行以下步骤:

      # 1. 打开终端或命令行窗口。
      # 2. 运行以下命令:
      echo_supervisord_conf > supervisord.conf
      

      这会将Supervisor的模板配置文件输出到名为 supervisord.conf 的文件中。

      1. 打开生成的 supervisord.conf 文件,您将看到一个模板配置文件的内容。

        该文件包含了一些示例的配置段,如[unix_http_server][supervisord][supervisorctl],以及一些默认设置的注释说明。

      2. 根据您的实际需求,在 supervisord.conf 文件中进行修改和扩展,添加您自己的进程配置。您可以指定进程的命令、日志文件路径、启动和停止脚本等。

      3. 保存修改后的 supervisord.conf 文件。

      现在,您可以使用生成的 supervisord.conf 文件作为Supervisor的配置文件,并通过 supervisord 命令启动Supervisor,以管理您的进程。请确保在启动 supervisord 前已经安装好了Supervisor,并将 supervisord 命令添加到系统的服务启动项或以守护进程的方式运行。

    • 产生的模板文件

      ; Sample supervisor config file.
      ;
      ; For more information on the config file, please see:
      ; http://supervisord.org/configuration.html
      ;
      ; Notes:
      ;  - Shell expansion ("~" or "$HOME") is not supported.  Environment
      ;    variables can be expanded using this syntax: "%(ENV_HOME)s".
      ;  - Quotes around values are not supported, except in the case of
      ;    the environment= options as shown below.
      ;  - Comments must have a leading space: "a=b ;comment" not "a=b;comment".
      ;  - Command will be truncated if it looks like a config file comment, e.g.
      ;    "command=bash -c 'foo ; bar'" will truncate to "command=bash -c 'foo ".
      ;
      ; Warning:
      ;  Paths throughout this example file use /tmp because it is available on most
      ;  systems.  You will likely need to change these to locations more appropriate
      ;  for your system.  Some systems periodically delete older files in /tmp.
      ;  Notably, if the socket file defined in the [unix_http_server] section below
      ;  is deleted, supervisorctl will be unable to connect to supervisord.
      
      [unix_http_server]
      file=/tmp/supervisor.sock   ; the path to the socket file
      ;chmod=0700                 ; socket file mode (default 0700)
      ;chown=nobody:nogroup       ; socket file uid:gid owner
      ;username=user              ; default is no username (open server)
      ;password=123               ; default is no password (open server)
      
      ; Security Warning:
      ;  The inet HTTP server is not enabled by default.  The inet HTTP server is
      ;  enabled by uncommenting the [inet_http_server] section below.  The inet
      ;  HTTP server is intended for use within a trusted environment only.  It
      ;  should only be bound to localhost or only accessible from within an
      ;  isolated, trusted network.  The inet HTTP server does not support any
      ;  form of encryption.  The inet HTTP server does not use authentication
      ;  by default (see the username= and password= options to add authentication).
      ;  Never expose the inet HTTP server to the public internet.
      
      ;[inet_http_server]         ; inet (TCP) server disabled by default
      ;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)
      
      [supervisord]
      logfile=/tmp/supervisord.log ; main log file; default $CWD/supervisord.log
      logfile_maxbytes=50MB        ; max main logfile bytes b4 rotation; default 50MB
      logfile_backups=10           ; # of main logfile backups; 0 means none, default 10
      loglevel=info                ; log level; default info; others: debug,warn,trace
      pidfile=/tmp/supervisord.pid ; supervisord pidfile; default supervisord.pid
      nodaemon=false               ; start in foreground if true; default false
      minfds=1024                  ; min. avail startup file descriptors; default 1024
      minprocs=200                 ; min. avail process descriptors;default 200
      ;umask=022                   ; process file creation umask; default 022
      ;user=supervisord            ; setuid to this UNIX account at startup; recommended if root
      ;identifier=supervisor       ; supervisord identifier, default is 'supervisor'
      ;directory=/tmp              ; default is not to cd during start
      ;nocleanup=true              ; don't clean up tempfiles at start; default false
      ;childlogdir=/tmp            ; 'AUTO' child log dir, default $TEMP
      ;environment=KEY="value"     ; key value pairs to add to environment
      ;strip_ansi=false            ; strip ansi escape codes in logs; def. false
      
      ; The rpcinterface:supervisor section must remain in the config file for
      ; RPC (supervisorctl/web interface) to work.  Additional interfaces may be
      ; added by defining them in separate [rpcinterface:x] sections.
      
      [rpcinterface:supervisor]
      supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
      
      ; The supervisorctl section configures how supervisorctl will connect to
      ; supervisord.  configure it match the settings in either the unix_http_server
      ; or inet_http_server section.
      
      [supervisorctl]
      serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL  for a unix socket
      ;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
      ;username=chris              ; should be same as in [*_http_server] if set
      ;password=123                ; should be same as in [*_http_server] if set
      ;prompt=mysupervisor         ; cmd line prompt (default "supervisor")
      ;history_file=~/.sc_history  ; use readline history if available
      
      ; The sample program section below shows all possible program subsection values.
      ; Create one or more 'real' program: sections to be able to control them under
      ; supervisor.
      
      ;[program:theprogramname]
      ;command=/bin/cat              ; the program (relative uses PATH, can take args)
      ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
      ;numprocs=1                    ; number of processes copies to start (def 1)
      ;directory=/tmp                ; directory to cwd to before exec (def no cwd)
      ;umask=022                     ; umask for process (default None)
      ;priority=999                  ; the relative start priority (default 999)
      ;autostart=true                ; start at supervisord start (default: true)
      ;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
      ;startretries=3                ; max # of serial start failures when starting (default 3)
      ;autorestart=unexpected        ; when to restart if exited after running (def: unexpected)
      ;exitcodes=0                   ; 'expected' exit codes used with autorestart (default 0)
      ;stopsignal=QUIT               ; signal used to kill process (default TERM)
      ;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
      ;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
      ;killasgroup=false             ; SIGKILL the UNIX process group (def false)
      ;user=chrism                   ; setuid to this UNIX account to run the program
      ;redirect_stderr=true          ; redirect proc stderr to stdout (default false)
      ;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
      ;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
      ;stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
      ;stdout_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
      ;stdout_events_enabled=false   ; emit events on stdout writes (default false)
      ;stdout_syslog=false           ; send stdout to syslog with process name (default false)
      ;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
      ;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
      ;stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
      ;stderr_capture_maxbytes=1MB   ; number of bytes in 'capturemode' (default 0)
      ;stderr_events_enabled=false   ; emit events on stderr writes (default false)
      ;stderr_syslog=false           ; send stderr to syslog with process name (default false)
      ;environment=A="1",B="2"       ; process environment additions (def no adds)
      ;serverurl=AUTO                ; override serverurl computation (childutils)
      
      ; The sample eventlistener section below shows all possible eventlistener
      ; subsection values.  Create one or more 'real' eventlistener: sections to be
      ; able to handle event notifications sent by supervisord.
      
      ;[eventlistener:theeventlistenername]
      ;command=/bin/eventlistener    ; the program (relative uses PATH, can take args)
      ;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
      ;numprocs=1                    ; number of processes copies to start (def 1)
      ;events=EVENT                  ; event notif. types to subscribe to (req'd)
      ;buffer_size=10                ; event buffer queue size (default 10)
      ;directory=/tmp                ; directory to cwd to before exec (def no cwd)
      ;umask=022                     ; umask for process (default None)
      ;priority=-1                   ; the relative start priority (default -1)
      ;autostart=true                ; start at supervisord start (default: true)
      ;startsecs=1                   ; # of secs prog must stay up to be running (def. 1)
      ;startretries=3                ; max # of serial start failures when starting (default 3)
      ;autorestart=unexpected        ; autorestart if exited after running (def: unexpected)
      ;exitcodes=0                   ; 'expected' exit codes used with autorestart (default 0)
      ;stopsignal=QUIT               ; signal used to kill process (default TERM)
      ;stopwaitsecs=10               ; max num secs to wait b4 SIGKILL (default 10)
      ;stopasgroup=false             ; send stop signal to the UNIX process group (default false)
      ;killasgroup=false             ; SIGKILL the UNIX process group (def false)
      ;user=chrism                   ; setuid to this UNIX account to run the program
      ;redirect_stderr=false         ; redirect_stderr=true is not allowed for eventlisteners
      ;stdout_logfile=/a/path        ; stdout log path, NONE for none; default AUTO
      ;stdout_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
      ;stdout_logfile_backups=10     ; # of stdout logfile backups (0 means none, default 10)
      ;stdout_events_enabled=false   ; emit events on stdout writes (default false)
      ;stdout_syslog=false           ; send stdout to syslog with process name (default false)
      ;stderr_logfile=/a/path        ; stderr log path, NONE for none; default AUTO
      ;stderr_logfile_maxbytes=1MB   ; max # logfile bytes b4 rotation (default 50MB)
      ;stderr_logfile_backups=10     ; # of stderr logfile backups (0 means none, default 10)
      ;stderr_events_enabled=false   ; emit events on stderr writes (default false)
      ;stderr_syslog=false           ; send stderr to syslog with process name (default false)
      ;environment=A="1",B="2"       ; process environment additions
      ;serverurl=AUTO                ; override serverurl computation (childutils)
      
      ; The sample group section below shows all possible group values.  Create one
      ; or more 'real' group: sections to create "heterogeneous" process groups.
      
      ;[group:thegroupname]
      ;programs=progname1,progname2  ; each refers to 'x' in [program:x] definitions
      ;priority=999                  ; the relative start priority (default 999)
      
      ; The [include] section can just contain the "files" setting.  This
      ; setting can list multiple files (separated by whitespace or
      ; newlines).  It can also contain wildcards.  The filenames are
      ; interpreted as relative to this file.  Included files *cannot*
      ; include files themselves.
      
      ;[include]
      ;files = relative/directory/*.ini
      

2.安装

本部分主要介绍ubuntu系统中进行安装的方式,其他系统中百度亦可;

2.1 使用 apt 安装

  1. 更新软件包列表:

    sudo apt update
    
  2. 安装Supervisor:

    sudo apt install supervisor
    
  3. 启动Supervisor服务:

    sudo systemctl start supervisor
    
  4. 验证Supervisor是否已经启动:

    sudo systemctl status supervisor
    

2.2 使用pip安装

# supervisor是基于python写的,所以使用pip来安装即可。
pip install supervisor
或者
pip3 install supervisor 

# 默认生成文件的路径
# supervisord 路径
/usr/local/bin/supervisord
# supervisorctl 路径
/usr/local/bin/supervisorctl
# echo_supervisord_conf 路径
/usr/local/bin/echo_supervisord_conf

如上路径,我们也可以通过whereis supervisordwhereis supervisorctlwhereis echo_supervisord_conf得到

验证是否安装成功supervisorctl --help

3.配置详解

supervisor 进程管理服务程序安装完毕后,会在系统同中生成两个配置文件:

主进程配置文件:/etc/supervisor/supervisord.conf

子进程配置文件: /etc/supervisor/conf.d;子进程可能有多个配置文件;

3.1 默认主配置文件

supervisor 进程默认产生的配置文件如下所示;

image-20230916184052736

内容详解

; supervisor config file

[unix_http_server]  ; 将unix_http_server 下的 file 路径改成如下内容
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)

;unix_http_server 下的 file 路径改成如下内容
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)

;以下部分必须保留在RPC的配置文件中
;(supervisorctl/web接口)要工作,可以使用其他接口
;通过在单独的rpcinterface:节中定义它们来添加
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

;supervisor 客户端
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket


;[include]部分可以只包含“files”设置。这
;设置可以列出多个文件(用空格或
;换行符)。它还可以包含通配符。文件名为
;解释为相对于此文件。包含的文件*不能*
;包括文件本身。
[include]  ; 包括路径下的所有文件;
files = /etc/supervisor/conf.d/*.conf

上面的路径只是推荐路径,可以根据自己的想法指向不同的路径;

# 创建文件
#touch /var/run/supervisor.sock  # 依据配置文件自动创建

mkdir /var/log/supervisor
touch /var/log/supervisor/supervisord.log

#touch /var/run/supervisord.pid  # 依据配置文件自动创建
mkdir /etc/supervisor/conf.d
# 添加权限
#chmod 777 /var/run 
#chmod 777 /var/log

3.2 子进程服务常用的配置解析

说明:更详细的配置参考模板部分的信息,使用的时候通常将该文件放在conf.d目录下;

[program:your_program_name]
command=/path/to/your_executable --arg1=value1 --arg2=value2  ; 子进程的启动命令及参数
directory=/path/to/your_working_directory                  ; 子进程的工作目录
user=your_username                                        ; 子进程运行的用户
autostart=true                                            ; 设置为自动启动子进程
autorestart=true                                          ; 允许自动重启
startretries=3                                            ; 启动重试次数
redirect_stderr=true                                      ; 将标准错误输出重定向到Supervisor日志
stdout_logfile=/path/to/your_stdout_log_file               ; 子进程的标准输出日志路径

4. 配置案例

主要用来描述并编写常见的supervisor相关的系统,主要有djangoflaskpython 脚本nginxmysqldocker等常见进程工具的部署后的进程监控的配置;

4.1 django 程序监控的配置

[program:your_django_program]
command=/path/to/your_virtualenv/bin/gunicorn your_django_project.wsgi:application --bind 127.0.0.1:8000  ; Django程序的启动命令
directory=/path/to/your_django_project                  ; Django程序的根目录
user=your_username                                      ; Django程序运行的用户
autostart=true                                          ; 设置为自动启动
autorestart=true                                        ; 允许自动重启
startretries=3                                          ; 启动重试次数
redirect_stderr=true                                    ; 将标准错误输出重定向到Supervisor日志
stdout_logfile=/path/to/your_stdout_log_file             ; 标准输出日志路径
environment=PATH="/path/to/your_virtualenv/bin"          ; 设置虚拟环境的路径

执行如下命令;

# 复制文件到指定的目录
sudo ./my_app.conf /etc/supervisor/conf.d/

读取并更新配置文件

# 读取
sudo supervisorctl reread
# 更新配置文件
sudo supervisorctl update
# 启动
sudo supervisorctl start my_app

4.2 flask 配置

  • 创建一个新的Supervisor配置文件,例如 your_flask_program.conf

  • 在配置文件中添加以下配置:

    [program:your_flask_program]
    command=/path/to/your_virtualenv/bin/gunicorn your_flask_app:app --bind 127.0.0.1:8000  ; Flask程序的启动命令
    directory=/path/to/your_flask_app                  ; Flask程序的根目录
    user=your_username                                 ; Flask程序运行的用户
    autostart=true                                     ; 设置为自动启动
    autorestart=true                                   ; 允许自动重启
    startretries=3                                     ; 启动重试次数
    redirect_stderr=true                               ; 将标准错误输出重定向到Supervisor日志
    stdout_logfile=/path/to/your_stdout_log_file        ; 标准输出日志路径
    environment=PATH="/path/to/your_virtualenv/bin"     ; 设置虚拟环境的路径
    
    • 在上述配置中,将 /path/to/your_virtualenv 替换为您的虚拟环境的路径,将 your_flask_app 替换为您的Flask应用程序的目录名称,将 your_flask_app:app 替换为您的Flask应用程序的 app 对象所在的模块和变量名。

    • 根据实际需要修改 --bind 参数以指定Gunicorn绑定的地址和端口。

    • 使用 export 命令设置虚拟环境的路径。

    • 通过 supervisorctl 命令启动Supervisor,并指定刚刚创建的配置文件:

      supervisorctl -c /path/to/your_supervisor.conf
      这样,Supervisor将在指定的虚拟环境中启动并监控Flask应用程序。
      请确保在启动Supervisor之前,虚拟环境已安装好,并存储了Flask程序所需的依赖。
      在使用Supervisor监控Flask程序时,请确保在虚拟环境中正确安装了Gunicorn,并提供了有效的启动命令和相关配置。
      
  • 方式二

    [program:my_app]
    command=/home/whj/data/envs/learn_code/bin/gunicorn -b 0.0.0.0:9000 -w 3 app:app
    directory=/home/whj/data/code/learn_code/ubuntu_code/learn
    user=whj
    autostart=true
    autorestart=true
    redirect_stderr=true
    stdout_logfile=/home/whj/data/log/my_log.log
    

    执行如下命令;

    # 复制文件到指定的目录
    sudo ./my_app.conf /etc/supervisor/conf.d/
    

    读取并更新配置文件

    # 读取
    sudo supervisorctl reread
    # 更新配置文件
    sudo supervisorctl update
    # 启动
    sudo supervisorctl start my_app
    

4.3 python脚本的监控

假设服务名称为test。启动文件为py类文件entry.py

[program:my_my]  ;指定名称
command=/home/whj/data/envs/learn_code/bin/python print_sleep.py    ; 启动路径
directory=/home/whj/data/code/learn_code/ubuntu_code/learn			; 代码路径
user=whj
autostart=true
autorestart=true
redirect_stderr=true
stdout_logfile=/home/whj/data/log/my_py.log  ; 指定日志输出

supervisor 未启动的时候使用如下命令启动

# 读取配置文件
sudo suppervisorctl reread
# 更新配置文件
sudo suppervisorctl update
# 服务启动
sudo supervisorctl start my_my  # 指定启动的名称,通常执行完成 update 之后服务已经会启动了,本句命令也可以用作检验使用;

4.4 docker监控

Supervisor 可以监控和管理 Docker 容器的状态,通过使用 Supervisor 的program配置项,指定Docker命令启动和停止容器。

以下是监控Docker容器状态的一般步骤:

  1. 安装Supervisor:使用适合您的系统的方法安装Supervisor。
  2. 创建Supervisor配置文件:创建Supervisor的配置文件,例如docker.conf
[program:mydockercontainer]
command=docker run --name mycontainer myimage
autostart=true
autorestart=true

在上述配置中,mydockercontainer是容器的名称,command指定了启动容器的Docker命令。

可以根据实际需要,在command中添加其他选项,如端口映射、环境变量等。

  1. 更新Supervisor配置:运行以下命令更新Supervisor的配置。
$ supervisorctl reread
$ supervisorctl update
  1. 启动Docker容器:运行以下命令启动Docker容器。
$ supervisorctl start mydockercontainer

现在,Supervisor会监控Docker容器的状态,并在需要时自动重启容器。

如果需要停止或重启Docker容器,可以使用以下命令:

$ supervisorctl stop mydockercontainer
$ supervisorctl restart mydockercontainer

通过配置Supervisor来管理和监控Docker容器,可以确保容器的稳定运行,并在崩溃或停止时自动重启。此外,Supervisor还提供了其他功能,如日志管理和进程管控等,可以进一步提高对Docker容器的监控和管理能力。

5.supervisor 开机自动启动

一般使用supervisor开机自动启动服务,路径/usr/lib/systemd/system/supervisor.service

[Unit]
Description=Supervisor process control system for UNIX
Documentation=http://supervisord.org
After=network.target

[Service]
ExecStart=/usr/bin/supervisord -n -c /etc/supervisor/supervisord.conf
ExecStop=/usr/bin/supervisorctl $OPTIONS shutdown
ExecReload=/usr/bin/supervisorctl -c /etc/supervisor/supervisord.conf $OPTIONS reload
KillMode=process
Restart=on-failure
RestartSec=50s

[Install]
WantedBy=multi-user.target

使用 apt 安装的时候默认存在该文件;

# 设置开机自动启动
systemctl enable supervisor
# 检查配置是否成功
systemctl is-enabled supervisor.service

image-20230916232649337

继续努力,终成大器!

标签:supervisor,supervisord,管理,default,supervisorctl,进程,Supervisor,false
From: https://www.cnblogs.com/Blogwj123/p/17729049.html

相关文章

  • Linux-----进程、线程、协程的生命周期、调度器slab
    Linux进程、线程、协程的区别进程进程是操作系统中的一个独立执行单元。每个进程都有自己的独立内存空间,包括代码段、数据段、堆栈等。进程之间通常需要通过进程间通信(IPC)来交换数据和信息。进程启动和销毁开销较大,因为需要分配和释放独立的内存空间。进程之间隔离度高,一个......
  • 亚信科技AntDB数据库与优逸派科技基于人工智能的自动化运维管理平台产品完成兼容性互
    日前,亚信科技AntDB数据库与北京优逸派科技有限公司基于人工智能的自动化运维管理平台产品完成兼容互认。经过双方团队的严格测试,AntDB数据库与基于人工智能的自动化运维管理平台产品完全兼容,整体运行稳定高效。图1:亚信科技AntDB数据库与优逸派科技完成适配随着我国数字经济建设......
  • 使用Vue3+elementPlus的Tree组件实现一个拖拽文件夹管理
    目录1、前言2、分析3、实现4、踩坑4.1、拖拽辅助线的坑4.2、数据的坑4.3、限制拖拽4.4、样式调整1、前言最近在做一个文件夹管理的功能,要实现一个树状的文件夹面板。里面包含两种元素,文件夹以及文件。交互要求如下:创建、删除,重命名文件夹和文件可以拖拽,拖拽文件到文件夹中,或......
  • WebRTC C++ 线程和线程管理剖析
    线程管理实例化代码(单例)ThreadManager*ThreadManager::Instance(){staticThreadManager*constthread_manager=newThreadManager();returnthread_manager;}初始化位置WebRTC中启动新线程的标准方法是通过创建Thread对象,然后调用Thread.Start()方法来启用......
  • 智慧工地系统源码,实现对施工全过程的实时监控、数据分析、智能管理和优化调控
    智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本,是建筑行业数字化转型升级的重要抓手。智慧工地物......
  • 智慧工地系统源码,实现对施工全过程的实时监控、数据分析、智能管理和优化调控
    智慧工地是指通过信息化技术、物联网、人工智能技术等手段,对建筑工地进行数字化、智能化、网络化升级,实现对施工全过程的实时监控、数据分析、智能管理和优化调控。智慧工地的建设可以提高工地的安全性、效率性和质量,降低施工成本,是建筑行业数字化转型升级的重要抓手。智慧工地物联......
  • Mantis 缺陷管理系统
    什么是MantisMantisBTisafreepopularweb-basedbugtrackingsystem(featurelist).ItiswritteninthePHPscriptinglanguageandworkswithMySQL,MSSQL,andPostgreSQLdatabasesandawebserver.MantisBThasbeeninstalledonWindows,Linux,MacOS,OS......
  • 【C++】动态内存管理 ⑤ ( 基础数据类型数组 内存分析 | 类对象 内存分析 | malloc 分
    文章目录一、基础数据类型数组内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存二、类对象内存分析1、malloc分配内存delete释放内存2、new分配内存free释放内存博客总结:C语言中使用malloc分配的内存,使用free进行释放;C++语言中......
  • 探索Navicat Premium 16:卓越的数据库管理软件解决方案 mac+win版
    在当今的数据驱动时代,一款高效、便捷的数据库管理软件对于企业、机构以及个人用户来说至关重要。NavicatPremium16,作为一款备受赞誉的数据库管理软件,正在满足这一需求,以其独特的功能和优势吸引着广大用户。→→↓↓载NavicatPremium16mac/win版一、NavicatPremium16的核......
  • 怎样的外发文件管理办法 能够避免文件外发泄露?
    在日常办公中,重要文件保密管理可谓“老生常谈”。但我们往往容易忽视,文件保密管理并非个体所能独立完成,在整个文件运转过程中,存在多名经手人,一人发生疏忽,则整个安全屏障都会被打破。因此,为了防止企业数据文件被随意拷贝或传输到公司外部,就有了各种防泄密办法,例如禁止U盘、禁止网......