linux后台自定义后台服务service(以filebeat举例)

news2025/2/3 22:47:58

文章目录

    • 一、配置攥写
      • 1)安装filebeat和配置相关修改
      • 2)常用命令
    • 二、启动顺序
      • 1)命令循序
      • 2)systemctl添加自定义系统服务(服务填写指南)
      • 3)linux的systemctl命令详解及使用教程
    • 三、遇到的坑点和报错
      • 1)systemctl服务部署错误:code=exited, status=217/USER
      • 2)selinux引起nginx启动失败
      • 3)OPENSSL引起nginx启动失败

一、配置攥写

1)安装filebeat和配置相关修改

  • 传送门
  • filebeat的service填写,设置为服务并开机启动
cd /lib/systemd/system

cat >  filebeat.service <<EOF
[Unit]
Description=filebeat
Wants=network-online.target
After=network-online.target

[Service]
User=root
ExecStart=/srv/filebeat-7.11.1-linux-x86_64/filebeat -e -c /srv/filebeat-7.11.1-linux-x86_64/filebeat.yml
# 设置为掉线自动重启,进程强制杀掉后会自动重新启动
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable filebeat
systemctl status filebeat
systemctl start  filebeat
systemctl status filebeat
journalctl  -f -u filebeat
  • logstash配置填写,设置为服务并开机启动
cd /lib/systemd/system

cat >  logstash.service <<EOF
[Unit]
Description=logstash
Wants=network-online.target
After=network-online.target

[Service]
User=root
ExecStart=/srv/logstash-7.11.1/bin/logstash -f /srv/logstash-7.11.1/beat_sa_output.config
# 设置为掉线自动重启,进程强制杀掉后会自动重新启动
Restart=always

[Install]
WantedBy=multi-user.target
EOF

systemctl daemon-reload
systemctl enable logstash
systemctl status logstash
systemctl start  logstash
systemctl status logstash
journalctl  -f -u logstash

2)常用命令

systemctl start filebeat              #启动filebeat服务
systemctl enable filebeat             #设置开机自启动
systemctl disable filebeat            #停止开机自启动
systemctl status filebeat             #查看服务当前状态
systemctl restart filebeat           #重新启动服务
systemctl list-units --type=service        #查看所有已启动的服务

启动某服务
systemctl start   tomcat.service

停止某服务
systemctl stop   tomcat.service
 
重启某服务
service tomcat   restart
systemctl restart   tomcat.service
 
使某服务自动启动(如tomcat服务)
systemctl enable   tomcat.service
 
使某服务不自动启动
systemctl disable   tomcat.service
 
检查服务状态
systemctl   status tomcat.service (服务详细信息)
systemctl   is-active tomcat.service(仅显示是否Active)

显示所有已启动的服务
systemctl   list-units --type=service

二、启动顺序

1)命令循序

[root@localhost redis-7.0.5]# vi /etc/systemd/system/redis.service
编辑文件,然后按Esc按键,输入“:wq”保存并退出。(如果要编辑按“a”按键。)
[root@localhost redis-7.0.5]# systemctl daemon-reload
# 启动
systemctl start redis
# 停止
systemctl stop redis
# 重启
systemctl restart redis
# 查看状态
systemctl status redis

2)systemctl添加自定义系统服务(服务填写指南)

  • service服务区别
    ①CentOS7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,需要开机不登陆就能运行的程序,
    ②存在系统服务里,即:/usr/lib/systemd/system目录下.
  • service配置攥写规则
    ①CentOS7的每一个服务以.service结尾,一般会分为3部分:[Unit]、[Service]和[Install]
[Unit]部分主要是对这个服务的说明,内容包括Description和After,Description 用于描述服务,After用于描述服务类别
Documentation : 服务文档
Before、After:定义启动顺序。Before=xxx.service,代表本服务在xxx.service启动之前启动。After=xxx.service,代表本服务在xxx.service之后启动。
Requires:这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,这个单元也停止了。
Wants:推荐使用。这个单元启动了,它需要的单元也会被启动;它需要的单元被停止了,对本单元没有影响。


[Service]部分是服务的关键,是服务的一些具体运行参数的设置.
Type=forking是后台运行的形式,
User=users是设置服务运行的用户,
Group=users是设置服务运行的用户组,
PIDFile为存放PID的文件路径,
ExecStart为服务的具体运行命令,
ExecReload为重启命令,
ExecStop为停止命令,
PrivateTmp=True表示给服务分配独立的临时空间
注意:[Service]部分的启动、重启、停止命令全部要求使用绝对路径,使用相对路径则会报错!

Type=simple(默认值):systemd认为该服务将立即启动。服务进程不会fork。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket激活型。
Type=forking:systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便systemd能够跟踪服务的主进程。
Type=oneshot:这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。
Type=notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。
Type=dbus:若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪。
Type=idle: systemd会等待所有任务(Jobs)处理完成后,才开始执行idle类型的单元。除此之外,其他行为和Type=simple 类似。
PIDFile:pid文件路径
ExecStart:指定启动单元的命令或者脚本,ExecStartPre和ExecStartPost节指定在ExecStart之前或者之后用户自定义执行的脚本。Type=oneshot允许指定多个希望顺序执行的用户自定义命令。
ExecReload:指定单元停止时执行的命令或者脚本。
ExecStop:指定单元停止时执行的命令或者脚本。
PrivateTmp:True表示给服务分配独立的临时空间
Restart:这个选项如果被允许,服务重启的时候进程会退出,会通过systemctl命令执行清除并重启的操作。
RemainAfterExit:如果设置这个选择为真,服务会被认为是在激活状态,即使所以的进程已经退出,默认的为假,这个选项只有在Type=oneshot时需要被配置。


[Install]部分是服务安装的相关设置,可设置为多用户的
Alias:为单元提供一个空间分离的附加名字。
RequiredBy:单元被允许运行需要的一系列依赖单元,RequiredBy列表从Require获得依赖信息。
WantBy:单元被允许运行需要的弱依赖性单元,Wantby从Want列表获得依赖信息。
Also:指出和单元一起安装或者被协助的单元。
DefaultInstance:实例单元的限制,这个选项指定如果单元被允许运行默认的实例。
  • 注意点
    ①首先,使用systemctl start [ 服务名(也是文件名) ] 可测试服务是否可以成功运行,如果不能运行则可以使用systemctl status [ 服务名(也是文件名) ]查看错误信息和其他服务信息,然后根据报错进行修改,直到可以start,如果不放心还可以测试restart和stop命令。
    ②接着,只要使用systemctl enable xxxxx就可以将所编写的服务添加至开机启动即可。

  • 举例tomcat项目

#vim /usr/lib/systemd/system/tomcat.service
 
[Unit]
Description=java tomcat project
After=tomcat.service
  
[Service]
Type=forking
User=users
Group=users
PIDFile=/usr/local/tomcat/tomcat.pid
ExecStart=/usr/local/tomcat/bin/startup.sh
ExecReload=
ExecStop=/usr/local/tomcat/bin/shutdown.sh
PrivateTmp=true
  
[Install]
WantedBy=multi-user.target
  • 设置为开机自启动:
systemctl enable tomcat.service

3)linux的systemctl命令详解及使用教程

1)首先检查系统上是否安装了systemd以及当前安装的Systemd的版本是什么?

# systemd --version
systemd 215
+PAM +AUDIT +SELINUX +IMA +SYSVINIT +LIBCRYPTSETUP +GCRYPT +ACL +XZ -SECCOMP -APPARMOR

从上面的例子可以清楚地看出,我们已经安装了systemd 215版本。

2)检查systemd和systemctl的二进制文件和库的安装位置。

# whereis systemd 
systemd: /usr/lib/systemd /etc/systemd /usr/share/systemd /usr/share/man/man1/systemd.1.gz
# whereis systemctl
systemctl: /usr/bin/systemctl /usr/share/man/man1/systemctl.1.gz

3)检查systemd是否正在运行。

# ps -eaf | grep [s]ystemd
root         1     0  0 16:27 ?        00:00:00 /usr/lib/systemd/systemd --switched-root --system --deserialize 23
root       444     1  0 16:27 ?        00:00:00 /usr/lib/systemd/systemd-journald
root       469     1  0 16:27 ?        00:00:00 /usr/lib/systemd/systemd-udevd
root       555     1  0 16:27 ?        00:00:00 /usr/lib/systemd/systemd-logind
dbus       556     1  0 16:27 ?        00:00:00 /bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation

注意:systemd作为父守护进程运行(PID = 1)。 在上面的命令ps中使用(-e)选择所有进程,( - a)选择除会话前导之外的所有进程和(-f)选择完整格式列表(即-eaf)。

4)分析systemd启动过程

# systemd-analyze
Startup finished in 487ms (kernel) + 2.776s (initrd) + 20.229s (userspace) = 23.493s

5)分析每个进程在引导时花费的时间

# systemd-analyze blame
8.565s mariadb.service
7.991s webmin.service
6.095s postfix.service
4.311s httpd.service
3.926s firewalld.service
3.780s kdump.service
3.238s tuned.service
1.712s network.service
1.394s lvm2-monitor.service
1.126s systemd-logind.service
....

6)如何使用systemctl命令终止服务

# systemctl kill httpd
# systemctl status httpd
httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled)
Active: failed (Result: exit-code) since Tue 2018-04-28 18:01:42 IST; 28min ago
Main PID: 2881 (code=exited, status=0/SUCCESS)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic:   0 B/sec"
Apr 28 17:37:29 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled.
Apr 28 17:37:29 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled.
Apr 28 17:37:39 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled.
Apr 28 17:37:39 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled.
Apr 28 17:37:49 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled.
Apr 28 17:37:49 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled.
Apr 28 17:37:59 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled.
Apr 28 17:37:59 tecmint systemd[1]: httpd.service: Got notification message from PID 2881, but recepti...bled.
Apr 28 18:01:42 tecmint systemd[1]: httpd.service: control process exited, code=exited status=226
Apr 28 18:01:42 tecmint systemd[1]: Unit httpd.service entered failed state.
Hint: Some lines were ellipsized, use -l to show in full.

7)其他systemctl命令连接
传送门

三、遇到的坑点和报错

1)systemctl服务部署错误:code=exited, status=217/USER

  • 报错描述
    在centos8下给tomcat注册systemctl服务时报错:
Process: 2688 ExecStart=/usr/local/tomcat/apache-tomcat-
9.0.36/bin/startup.sh (code=exited, status=217/USER)

在这里插入图片描述

  • 配置文件
[Unit]
Description=Tomcat9 servlet
After=syslog.target network.target
 
[Service]
Type=forking
 
User=tomcat
Group=tomcat
 
Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="JAVA_OPTS=-Djava.awt.headless=true"
 
Environment="CATALINA_BASE=/usr/local/tomcat/apache-tomcat-9.0.36"
Environment="CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.36"
Environment="CATALINA_PID=/usr/local/tomcat/apache-tomcat-9.0.36/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
 
ExecStart=/usr/local/tomcat/apache-tomcat-9.0.36/bin/startup.sh
ExecStop=/usr/local/tomcat/apache-tomcat-9.0.36/bin/shutdown.sh
 
[Install]
WantedBy=multi-user.target
  • 原因
    最后查到是因为[Service]下的User和Group错了,没有这个用户和组,全部改成root就好了。
[Unit]
Description=Tomcat9 servlet
After=syslog.target network.target
 
[Service]
Type=forking
 
User=root
Group=root
 
Environment="JAVA_HOME=/usr/lib/jvm/jre"
Environment="JAVA_OPTS=-Djava.awt.headless=true"
 
Environment="CATALINA_BASE=/usr/local/tomcat/apache-tomcat-9.0.36"
Environment="CATALINA_HOME=/usr/local/tomcat/apache-tomcat-9.0.36"
Environment="CATALINA_PID=/usr/local/tomcat/apache-tomcat-9.0.36/temp/tomcat.pid"
Environment="CATALINA_OPTS=-Xms512M -Xmx1024M -server -XX:+UseParallelGC"
 
ExecStart=/usr/local/tomcat/apache-tomcat-9.0.36/bin/startup.sh
ExecStop=/usr/local/tomcat/apache-tomcat-9.0.36/bin/shutdown.sh
 
[Install]
WantedBy=multi-user.target

2)selinux引起nginx启动失败

  • 问题描述:
    修改了nginx的配置文件,绑定了监听9089端口,重启nginx的时候失败了。发现报错“nginx: [emerg] bind() to 0.0.0.0:9089 failed (13: Permission denied)”:
[root@test101 nginx]# systemctl restart nginx

Job for nginx.service failed because the control process exited 
with error code. See "systemctl status nginx.service" and 
"journalctl -xe" for details.
[root@test101 nginx]# systemctl status nginx.service

● nginx.service - nginx - high performance web server

Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)

Active: failed (Result: exit-code) since 五 2018-07-20 09:27:01 CST; 8s ago

Docs: http://nginx.org/en/docs/

Process: 50264 ExecStop=/bin/kill -s TERM $MAINPID (code=exited, status=0/SUCCESS)

Process: 50329 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE)

Main PID: 50243 (code=exited, status=0/SUCCESS)
  • 解决方法:
    发现是因为selinux状态是enforcing,关闭了selinux再启动nginx就好了
[root@test101 nginx]# vim /etc/selinux/config
# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
# enforcing - SELinux security policy is enforced.
# permissive - SELinux prints warnings instead of enforcing.
# disabled - No SELinux policy is loaded.

SELINUX=enforcing #改成disabled就OK了

# SELINUXTYPE= can take one of three two values:
# targeted - Targeted processes are protected,
# minimum - Modification of targeted policy. Only selected processes are protected.
# mls - Multi Level Security protection.
SELINUXTYPE=targeted

3)OPENSSL引起nginx启动失败

  • 问题描述:
    在部署深圳电信nginx的时候,启动失败了,报错说找不到OPENSSL_1.0.2:
[root@host-172-0-0-11 conf.d]# systemctl start nginx

Job for nginx.service failed because the control process exited with error code. See "systemctl status nginx.service" and "journalctl -xe" for details.
  • 原因
    查看报错原因,发现提示“version `OPENSSL_1.0.2’ not found”:
[root@host-172-0-0-11 conf.d]# systemctl status nginx.service

â— nginx.service - nginx - high performance web server

Loaded: loaded (/usr/lib/systemd/system/nginx.service; disabled; vendor preset: disabled)

Active: failed (Result: exit-code) since Thu 2018-08-02 11:11:40 CST; 7s ago

Docs: http://nginx.org/en/docs/

Process: 18995 ExecStart=/usr/sbin/nginx -c /etc/nginx/nginx.conf (code=exited, status=1/FAILURE)

Aug 02 11:11:40 host-172-51-121-11 systemd[1]: Starting nginx - high performance web server...

Aug 02 11:11:40 host-172-51-121-11 nginx[18995]: /usr/sbin/nginx: /lib64/libcrypto.so.10: version `OPENSSL_1.0.2' not found (required by /usr/sbin/nginx)
  • 原因
    查看本机的openssl,发现本机的openssl确实与nginx要求的版本不符合
[root@host-172-51-121-11 conf.d]# rpm -qa openssl
openssl-1.0.1e-60.el7.x86_64
[root@host-172-0-0-11 conf.d]#
  • 解决方法:
    重新安装OPENSSL_1.0.2,然后启动nginx,成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/103632.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

谁再要你自学网络安全,请给他一大B兜

前言 作为一名6年网安工程师老菜鸟来说&#xff0c;我实在想不通&#xff0c;开发岗位那么多&#xff0c;为什么要来学网安? 在这里必须给那些准备入坑的同学泼几盆冷水&#xff01;零基础自学网络安全&#xff1f;劝你还是别做梦了&#xff01; 基础确实很简单&#xff0c…

2023火爆共享购商业模式概念、框架、基础制度

各位企业家及创业者朋友们&#xff0c;你们好。我是微三云&#xff08;陈志坤&#xff09;&#xff0c;在你打开这个文章的时候&#xff0c;先不要急&#xff0c;因为任何一个能够长久、安稳、盈利的平台&#xff0c;背后肯定有一位看准宏观方向且耐心的人。这是一个极具颠覆性…

算法图论篇

文章目录一、DFS1.排列数字&#xff08;全排列&#xff09;2.n皇后3.树的重心二、BFS1.走迷宫2.八数码3.图中点的层次三、拓扑排序1.有向图的拓扑序列四、最短路1.Dijkstra2. bellman-ford3.spfa4.floyd五、求最小生成树1.Prim算法2.Kruskal算法六、二分图1.染色法判定二分图2.…

UWB汽车钥匙介绍

汽车钥匙经历了机械钥匙、遥控钥匙、PEPS、数字钥匙四个阶段&#xff0c;而数字钥匙又分为BLE/NFC/UWB三种技术路线。 由于UWB安全性、定位精度、作用范围明显好于BLE和NFC&#xff0c;因此成为汽车数字钥匙的最优技术。 PEPS与数字钥匙: PEPS是指无钥匙进入/无钥匙启动系统&a…

【爬虫】JS调试解决反爬问题系列2

⭐️⭐️⭐️⭐️⭐️欢迎来到我的博客⭐️⭐️⭐️⭐️⭐️ &#x1f434;作者&#xff1a;秋无之地 &#x1f434;简介&#xff1a;CSDN爬虫、后端、大数据领域创作者。目前从事python爬虫、后端和大数据等相关工作&#xff0c;主要擅长领域有&#xff1a;爬虫、后端、大数据…

ubuntu arm架构各版本源整理

目录 一、x86机构 1、ubuntu 20.04 2、ubuntu 18.04 3、ubuntu 21.10 4、ubuntu 22.04 二、arm机构 1、ubuntu 20.04 2、ubuntu 18.04 3、ubuntu 21.10 4、ubuntu 22.04 三、出现的问题 1、换成国内源后报https证书问题 2、如果选择国内开源站 ​3、提示the publi…

C语言重点解剖操作符要点速记

1.在多层嵌套的时候&#xff0c;每一次}结束加一个注释&#xff0c;标记清楚结束的是哪一个。 2.大部分注释都换成了空格。 in/* */t a; 等价于 in t a;替换成一个空格。 3.# define(中间可以有空格)&#xff0c;但是不建议。 4.全局变量&#xff0c;常量定义等建议加上注释…

基于昇思MindSpore Quantum,实现量子虚时演化算法

01、关于昇思MindSpore项目介绍 1.项目名称 基于昇思MindSpore Quantum&#xff0c;实现量子虚时演化算法 2.项目链接 https://summer-ospp.ac.cn/#/org/prodetail/221cb0176 3.项目描述 在本次项目中&#xff0c;我们将运用MindSpore Quantum框架在量子线路上完成虚时演…

【Django】第一课 银行账户管理系统开发

概念 django服务器开发框架是一款基于Python编程语言用于web服务器开发的框架&#xff0c;采用的是MTV架构模式进行分层架构。 项目的搭建 1.打开pycharm开发软件&#xff0c;打开开发软件的内置dos窗口操作命令行 在这里指定项目存放的磁盘路径&#xff0c;并使用创建djang…

算法刷题日志——dp

文章目录[打家劫舍 III](https://leetcode.cn/problems/house-robber-iii/description/)卖股票的最佳时机[买卖股票的最佳时机 II](https://leetcode.cn/problems/best-time-to-buy-and-sell-stock-ii/)[买卖股票的最佳时机 III](https://leetcode.cn/problems/best-time-to-bu…

RK3588平台开发系列讲解(系统篇)A/B System的介绍

平台内核版本安卓版本RK3588Linux 5.10Android 12文章目录 一、简介二、配置2.1、uboot配置2.2、system bootctrl参考沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将介绍RK3588平台的A/B System。 一、简介 A/B System指的是存在两套可以正常工作的系统,分别存…

项目实战!!! 在docker上部署Jenkins

需求&#xff1a;通过docker安装jenkins&#xff0c;并且通过Jenkins部署项目&#xff0c;最终效果是只要在jenkins对某个项目点击构建&#xff0c;jenkins就会去gitLab上拉取最新项目的最新代码&#xff0c;然后根据你自己项目的pom.xml文件&#xff0c;把项目打包成jar&#…

选择机器视觉传感器时要注意什么

在上篇文章中小编讲解了机器视觉传感器在测量中有哪些优势&#xff0c;看些看过文章的朋友有了个大概的了解&#xff0c;但是当我们在要使用机器视觉传感器时&#xff0c;一定要会正确的选择&#xff0c;这样才能保证产品在实际运用当中可以准确的检测出产品是否存在问题&#…

什么是框架?Java开发中常用的框架有哪些?

什么是框架 “框架&#xff08;Framework&#xff09;"一词最早出现在建筑领域&#xff0c;指的是在建造房屋前期构建的建筑骨架。在编程领域&#xff0c;框架就是应用程序的骨架&#xff0c;开发人员可以在这个骨架上加入自己的东西&#xff0c;搭建出符合自己需求的应用…

51单片机双轴太阳能追光追日系统ULN2003步进电机

实践制作DIY- GC0097-双轴太阳能追光追日系统 一、功能说明&#xff1a; 基于51单片机设计-双轴太阳能追光追日系统 功能介绍&#xff1a; STC15W48S4系列最小系统板2个ULN2003步进电机LCD1602显示器18650锂电池锂电池充电板4个光敏电阻太阳能充电 1.双轴XY追日&#xff0c…

这波无感升级有点秀——天翼云QEMU组件热升级方案来了

虚拟化技术作为云计算时代的核心技术&#xff0c;近年来应用越来越广泛。目前&#xff0c;大多数云厂商提供的云主机都是基于KVM/QEMU虚拟化技术实现的。而随着虚拟化技术的发展&#xff0c;QEMU组件也在不断引入新功能并进行功能优化和问题修复。 在公有云场景中&#xff0c;…

【解决方案】艾美捷脂肪生成测定试剂盒的功能和应用

肥胖在世界范围内日益受到关注&#xff0c;在美国已达到流行程度。1它是困扰我们社会的许多主要慢性疾病的危险因素&#xff0c;包括心血管疾病、糖尿病和癌症。近年来&#xff0c;许多研究集中于确定肥胖的发病机制&#xff0c;这是一个增加脂肪细胞数量&#xff08;脂肪细胞增…

游戏开发 dictionary 源码解析

Dictionary是我们经常使用的&#xff0c;一起来看看它是如何构造的&#xff0c;及有哪些优缺点。 Dictionary是一种键值对的形式存放数据&#xff0c;即 key值 、value 值 一 一映射的。key的类型没有限制&#xff0c;可以是整数、字符串甚至是实例对象。 Dictionary的实现原…

Java项目:springboot+vue大学生健康档案管理系统

作者主页&#xff1a;源码空间站2022 简介&#xff1a;Java领域优质创作者、Java项目、学习资料、技术互助 文末获取源码 项目介绍 大学生健康档案管理系统&#xff0c;目前演示数据中主要包括三种角色&#xff1a;管理员、医生、学生&#xff1b;其中管理员包含最高权限&…

Metal每日分享,自然饱和度滤镜效果

本案例的目的是理解如何用Metal实现自然饱和度效果滤镜&#xff0c;简单讲就是调整图像整体的明亮程度&#xff0c;如调节到较高数值&#xff0c;图像会产生色彩过饱和从而引起图像失真&#xff1b; Demo HarbethDemo地址iDay每日分享文档地址 实操代码 // 自然饱和度滤镜 l…