如何在 Ubuntu 14.04 上配置 StatsD 以收集 Graphite 的任意统计数据

介绍

Graphite 是一个图形库,允许您以灵活和强大的方式可视化不同类型的数据。它通过其他统计收集应用程序发送给它的数据进行图形化。

在之前的指南中,我们讨论了如何安装和配置 Graphite 本身,以及如何安装和配置 collectd 以编译系统和服务统计信息。

在本指南中,我们将讨论如何安装和配置 StatsD。StatsD 是一个轻量级的统计信息收集守护程序,可用于收集任意统计信息。

StatsD 与 Graphite 的配置写入间隔同步刷新统计信息。为此,它在刷新间隔之间聚合所有数据,并为每个统计信息创建单个点以发送到 Graphite。

通过这种方式,StatsD 让应用程序绕过发送 Graphite 统计信息的有效速率限制。它有许多用不同编程语言编写的库,使得在应用程序中轻松构建统计跟踪成为可能。

在本指南中,我们将安装和配置 StatsD。我们将假设您已经按照之前的指南中的安装说明进行了操作,并且在您的 Ubuntu 14.04 服务器上已经配置了 Graphite 和 collectd。

安装 StatsD

StatsD 程序不在 Ubuntu 默认仓库中。但是,它在 GitHub 上可用,并且具有将其编译为 Ubuntu 软件包所需的配置文件。

获取组件

在安装实际程序之前,我们需要从仓库中获取一些软件包。我们需要 git,以便我们可以克隆仓库。我们还需要 node.js,因为 StatsD 是一个 node 应用程序。

我们还需要一些软件包,这些软件包将允许我们构建 Ubuntu 软件包。现在让我们获取所有这些软件包:

sudo apt-get install git nodejs devscripts debhelper

我们将在我们的主目录中创建软件包。更具体地说,我们将在主目录中创建一个名为 “build” 的目录来完成此过程。

现在创建该目录:

mkdir ~/build

现在,我们将 StatsD 项目克隆到该目录中。进入该目录,然后执行克隆命令:

cd ~/build
git clone https://github.com/etsy/statsd.git

构建和安装软件包

进入包含我们的 StatsD 文件的新目录:

cd statsd

现在,我们可以通过简单地发出此命令来创建 StatsD 软件包:

dpkg-buildpackage

一个 .deb 文件将被创建在 ~/build 目录中。让我们回到该目录。

cd ..

在安装软件包之前,我们要停止 Carbon 服务。原因是 StatsD 服务在安装时将立即开始发送信息,而它尚未正确配置。

通过发出此命令暂时停止 Carbon 服务:

sudo service carbon-cache stop

然后我们可以将软件包安装到我们的系统中:

sudo dpkg -i statsd*.deb

正如我们之前所说,Statsd 进程会自动启动。让我们暂时停止它,并重新启动我们的 Carbon 服务。这将允许我们在配置 StatsD 的同时仍然保持 Carbon 为我们的其他服务活动:

sudo service statsd stop
sudo service carbon-cache start

StatsD 服务现在已安装在我们的服务器上!但是,我们仍然需要配置所有组件以正确地协同工作。

配置 StatsD

我们应该做的第一件事是修改 StatsD 配置文件。

使用文本编辑器打开文件:

sudo nano /etc/statsd/localConfig.js

它应该看起来像这样:

{graphitePort: 2003
, graphiteHost: "localhost"
, port: 8125
}

在此配置中,我们只想调整一个设置。我们想要关闭一个称为 legacy namespacing 的东西。

StatsD 使用这个来以不同的方式组织其数据。然而,在更近期的版本中,它已经标准化了更直观的结构。我们想要使用新的格式。

为此,我们需要添加以下行:

{graphitePort: 2003
, graphiteHost: "localhost"
, port: 8125
, graphite: {legacyNamespace: false}
}

这将让我们使用更合理的命名约定。完成后保存并关闭文件。

为 StatsD 创建存储模式

接下来,我们需要定义一些更多的存储模式。

打开存储模式文件:

sudo nano /etc/carbon/storage-schemas.conf

我们将使用与我们为 collectd 定义的完全相同的保留策略。唯一的区别是名称和匹配模式。

StatsD 将其所有数据发送到 Graphite,带有 stats 前缀,因此我们可以匹配该模式。记住将此放在默认存储规范之上:

[statsd]
pattern = ^stats.*
retentions = 10s:1d,1m:7d,10m:1y

完成后保存并关闭文件。

创建数据聚合配置

让我们设置一些聚合规范。StatsD以非常特定的方式发送数据,因此我们可以通过匹配正确的模式轻松确保正确地聚合数据。

在编辑器中打开文件:

sudo nano /etc/carbon/storage-aggregation.conf

我们需要以灵活的方式配置我们的聚合,以准确转换我们的值。我们将从StatsD项目中获取一些线索,以便最佳地聚合数据。

当前,聚合看起来像这样:

[min]
pattern = \.min$
xFilesFactor = 0.1
aggregationMethod = min[max]
pattern = \.max$
xFilesFactor = 0.1
aggregationMethod = max[sum]
pattern = \.count$
xFilesFactor = 0
aggregationMethod = sum[default_average]
pattern = .*
xFilesFactor = 0.5
aggregationMethod = average

我们希望匹配以.sum.count结尾的指标,并将这些值相加以进行聚合。我们已经定义了其中一个(使用sum部分),但它的标签有点错误,因此我们将进行调整。

我们还希望获取以.lower.upper结尾的指标的最小值和最大值。这些指标名称后面可能还有数字,因为它们可以用于指示某个百分比的上限值(例如upper_90)。

最后,我们希望配置我们的仪表,它基本上只是测量某物的当前值(例如速度表)。我们希望将这些设置为始终发送我们给定的最后一个值。在这种情况下,我们不希望使用平均值或任何其他计算出的值。

最终,文件应该看起来像这样:

[min]
pattern = \.min$
xFilesFactor = 0.1
aggregationMethod = min[max]
pattern = \.max$
xFilesFactor = 0.1
aggregationMethod = max<span class="highlight">[count]</span>
pattern = \.count$
xFilesFactor = 0
aggregationMethod = sum<span class="highlight">[lower]</span>
<span class="highlight">pattern = \.lower(_\d+)?$</span>
<span class="highlight">xFilesFactor = 0.1</span>
<span class="highlight">aggregationMethod = min</span><span class="highlight">[upper]</span>
<span class="highlight">pattern = \.upper(_\d+)?$</span>
<span class="highlight">xFilesFactor = 0.1</span>
<span class="highlight">aggregationMethod = max</span><span class="highlight">[sum]</span>
<span class="highlight">pattern = \.sum$</span>
<span class="highlight">xFilesFactor = 0</span>
<span class="highlight">aggregationMethod = sum</span><span class="highlight">[gauges]</span>
<span class="highlight">pattern = ^.*\.gauges\..*</span>
<span class="highlight">xFilesFactor = 0</span>
<span class="highlight">aggregationMethod = last</span>[default_average]
pattern = .*
xFilesFactor = 0.5
aggregationMethod = average

完成后保存并关闭文件。

启动服务

现在您已经配置好了一切,我们可以进行一些服务管理。

首先,您需要重新启动Carbon以应用您刚刚设置的新设置。最好完全停止服务,等待几秒钟,然后再启动,而不是只使用“restart”命令:

sudo service carbon-cache stop      ## 在此等待几秒钟
sudo service carbon-cache start

现在,您还可以启动StatsD服务,它将连接到Carbon:

sudo service statsd start

就像Carbon本身一样,StatsD也会报告自己的统计信息。这意味着如果您再次访问浏览器中的Graphite页面,您可以立即看到一些新信息。如果已经运行,请刷新页面:

http://<span class="highlight">domain_name_or_ip</span>

正如您所看到的,我们有许多不同的信息可用,所有这些信息都与StatsD本身有关:

!StatsD内部信息

让我们稍微了解一下如何向StatsD提供数据以及我们如何与其交互。

StatsD数据指标的解剖

StatsD服务使用TCP连接连接到Graphite服务。这允许可靠地传输信息。

但是,StatsD本身监听UDP数据包。它在一段时间内(默认为10秒)收集发送到它的所有数据包。然后,它聚合它收到的数据包,并将每个指标的单个值刷新到Carbon。

重要的是要意识到10秒的刷新间隔正是我们在存储模式中配置的最短存储间隔。这两个配置值必须匹配,因为这是使StatsD能够绕过Carbon仅接受每个间隔的一个值的限制。

由于这些程序之间的差异,我们发送数据到StatsD的方式与直接发送到Graphite时略有不同。如果您回忆一下,我们通过指定指标名称、值和时间戳将数据发送到Graphite,就像这样:

echo "<span class="highlight">metric_name metric_value</span> `date +%s` | nc -q0 127.0.0.1 2003

这有一些优点,比如允许您设置接收到的数据的时间戳,这样可以让您以后添加数据。对于发送到StatsD的数据,我们放弃使用时间戳,而是用数据类型替换它。

语法看起来像这样:

echo "<span class="highlight">metric_name</span>:<span class="highlight">metric_value</span>|<span class="highlight">type_specification</span>" | nc -u -w0 127.0.0.1 8125

这将向StatsD正在监听的端口发送一个UDP数据包。

请记住,就像直接发送统计信息到Graphite一样,这仍然不是通常发送统计信息的方式。nc方法只是用于演示目的。

有许多出色的StatsD客户端库,使得使用适合您的编程逻辑从您创建的应用程序发送统计信息变得很容易。我们马上就会演示这一点。

指标名称和值非常直观。让我们看看可能的指标类型以及它们对StatsD的含义:

  • c:这表示“计数”。基本上,它会在刷新间隔内将StatsD收到的指标的所有值相加,并发送总值。这类似于Carbon使用的“sum”聚合方法,这就是为什么我们告诉Carbon在存储这种指标的较长间隔时使用该聚合方法。
  • g:这表示一个仪表。仪表显示某物的当前值,类似于速度表或油量表。在这些情况下,我们只对最新值感兴趣。StatsD将继续向Carbon发送相同的值,直到它收到不同的值。Carbon使用“last”方法对这些数据进行聚合,以保持信息的含义。
  • s:此标记表示传递的值是数学集。数学上的集合包含唯一值。因此,我们可以向StatsD发送大量此类型的值,它将计算它接收到唯一值的次数。这对于诸如计算唯一用户的数量(假设您有与这些用户关联的唯一ID属性)的任务可能很有用。
  • ms:这表示值是时间跨度。StatsD接收时间值,并根据数据实际上创建了许多不同的信息。它向Carbon传递有关平均值、百分位数、标准偏差、总和等的信息。Carbon必须正确地对这些信息进行聚合,这就是为什么我们添加了许多聚合方法。

正如您所看到的,StatsD会为我们的指标做很多工作,使其更容易理解。它以大多数应用程序理解的方式讨论统计信息,并且只要告诉它数据代表什么,它就会在正确的格式中完成大部分繁重的工作。

探索不同的数据类型

计量

让我们向 StatsD 发送一些数据来尝试一下。最简单的是一个计量。这将设置一个指标的当前状态,因此它只会传递它收到的最后一个值:

echo "sample.gauge:14|g" | nc -u -w0 127.0.0.1 8125

现在,如果在十秒后(StatsD 的刷新频率)刷新 Graphite 接口,我们应该会看到新的统计数据(它将位于 stats > gauges > sample 层次结构下)。

注意这次行是不间断的。我们可以刷新图表,每个间隔都会有一个值。以前,Graphite 的数据中会有间断,因为在一段时间内没有收到某些指标的值。使用计量,StatsD 每次刷新时都会发送最后可用的值。它假设你会告诉它何时该值应该更改。

为了看到变化,让我们再发送一些计量的值:

echo "sample.gauge:10|g" | nc -u -w0 127.0.0.1 8125

现在等待至少十秒,以便 StatsD 发送该值,然后发送:

echo "sample.gauge:18|g" | nc -u -w0 127.0.0.1 8125

你将会看到一个类似于这样的图表(我们正在查看一个 8 分钟的时间范围):

!StatsD 计量的实际效果

正如你所看到的,这与 Graphite 已经存在的功能非常相似,因为它只记录每个十秒间隔的一个值。不同之处在于,StatsD 确保每个间隔使用最后已知的值。

计数

让我们通过配置一个计数指标来进行一些对比。

StatsD 将在其十秒刷新间隔期间收集到的所有数据相加,以发送该时间段的单个值。这更接近于我们想要记录的大多数指标的数据。

例如,我们可以连续向 StatsD 发送一个计数指标:

echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125
echo "sample.count:1|c" | nc -u -w0 127.0.0.1 8125

现在,假设这些都是在同一个间隔内发送的(一些值可能落在间隔标记的两侧),当我们刷新接口时,应该会看到计数的一个值。确保调整接口以仅显示过去 5 到 15 分钟的数据。

实际上创建了两个指标。count 指标告诉我们在我们的刷新间隔内发生的次数,而 rate 指标将该数字除以十,得到每秒发生的次数。这两个看起来像这样:

!StatsD 计数和速率

正如你所看到的,与计量指标不同,计数指标在刷新之间不保留其值。这就是该指标的含义。如果你正在计算用户点击按钮的次数,仅因为他在十秒内点击了两次,并不意味着接下来的十秒该数字也会是两。

集合

现在让我们尝试一个集合。

记住,集合记录传递给指标的唯一值的数量。因此,我们可以发送五条记录,但如果其中四条具有相同的值,则记录的数量将是两,因为这是唯一值的数量:

echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:50|s" | nc -u -w0 127.0.0.1 8125
echo "sample.set:11|s" | nc -u -w0 127.0.0.1 8125

你可以在下图中看到,我的值最初跨越了一个刷新间隔,因此只记录了一个数字。我不得不再试一次才能第二次得到该序列:

!StatsD 集合示例

正如你所看到的,我们传递的实际在集合中是无关紧要的。我们只关心传递了多少个唯一值。

定时器

定时器可能是最有趣的指标。

StatsD 在计算定时器数据方面做了大量工作。它向 Carbon 发送许多不同的指标:

echo "sample.timer:512|ms" | nc -u -w0 127.0.0.1 8125

如果我们在几分钟内发送多个值,我们可以看到许多不同的信息,比如平均执行时间、计数指标、最大和最小值等。

它可能看起来像这样:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

这是一个很好的指标,可以提供有关您正在创建的程序执行情况的信息。它可以告诉您您所做的更改是否减慢了应用程序的速度。

发送 StatsD 指标

现在您已经了解了数据包的结构,让我们简要地看一下我们可以在程序中使用的一个 StatsD 库。任何具有发送 UDP 数据包功能的语言都可以创建 StatsD 指标,但库可以使这变得特别简单。

由于 Graphite 使用 Django,让我们留在这个环境中,看看一个 Python 库。

首先,安装 pip,一个 Python 包管理器:

sudo apt-get install python-pip

现在,我们可以告诉它通过输入以下命令来安装 python-statsd 包的最新版本:

sudo pip install python-statsd

这是一个非常简单的 StatsD 客户端。

启动一个 Python 交互会话来加载库:

python

现在,我们可以通过输入以下命令导入库:

import statsd

从这里开始,使用非常简单。我们可以创建代表各种指标的对象,然后根据需要进行调整。

例如,我们可以创建一个 gauge 对象,然后通过输入以下命令将其设置为 15:

gauge = statsd.Gauge('Python_metric')
gauge.send('some_value', 15)

然后,我们可以使用 gauge.send 发送我们想要的任何值到 StatsD。该库对其他指标类型也具有类似的功能。您可以通过查看项目页面了解它们。

现在,您应该对如何在应用程序中构建跟踪有了相当好的了解。向 StatsD 发送任意指标以进行跟踪和分析的能力使得跟踪统计数据变得如此简单,以至于几乎没有理由不收集数据。

结论

到目前为止,您应该已经安装和配置了 Graphite。通过完成本教程和上一篇教程,您还配置了 collectd 来收集系统性能指标,并配置了 StatsD 来收集有关您自己开发项目的任意数据。

通过学习如何利用这些工具,您可以开始构建复杂而可靠的统计跟踪,帮助您对环境的每个部分做出明智的决策。数据驱动决策的优势是巨大的,因此尽早将指标收集集成到您的基础架构中。

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

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

相关文章

【MATLAB源码-第197期】基于matlab的粒子群算法(PSO)结合人工蜂群算法(ABC)无人机联合卡车配送仿真。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 基于粒子群优化&#xff08;PSO&#xff09;算法的无人机联合卡车配送系统是一个高效的物流配送策略&#xff0c;旨在优化配送过程中的成本、时间和资源利用率。该系统融合了无人机和卡车的配送能力&#xff0c;通过智能算法…

Tiny11作者开源:利用微软官方镜像制作独属于你的Tiny11镜像

微软对Windows 11的最低硬件要求包括至少4GB的内存、双核处理器和64GB的SSD存储。然而&#xff0c;这些基本要求仅仅能保证用户启动和运行系统&#xff0c;而非流畅使用 为了提升体验&#xff0c;不少用户选择通过精简系统来减轻硬件负担&#xff0c;我们熟知的Tiny11便是其中…

【简单介绍下机器学习之sklearn基础】

&#x1f3a5;博主&#xff1a;程序员不想YY啊 &#x1f4ab;CSDN优质创作者&#xff0c;CSDN实力新星&#xff0c;CSDN博客专家 &#x1f917;点赞&#x1f388;收藏⭐再看&#x1f4ab;养成习惯 ✨希望本文对您有所裨益&#xff0c;如有不足之处&#xff0c;欢迎在评论区提出…

【机器学习】深度神经网络(DNN):原理、应用与代码实践

深度神经网络&#xff08;DNN&#xff09;&#xff1a;原理、应用与代码实践 一、深度神经网络&#xff08;DNN&#xff09;的基本原理二、DNN的优缺点分析三、DNN的代码实践四、总结与展望 在人工智能与机器学习的浪潮中&#xff0c;深度神经网络&#xff08;Deep Neural Netw…

演示在一台Windows主机上运行两个Mysql服务器(端口号3306 和 3307),安装步骤详解

目录 在一台Windows主机上运行两个Mysql服务器&#xff0c;安装步骤详解因为演示需要两个 MySQL 服务器终端&#xff0c;我只有一个 3306 端口号的 MySQL 服务器&#xff0c;所以需要再创建一个 3307 的。创建一个3307端口号的MySQL服务器1、复制 mysql 的安装目录2、修改my.in…

安全开发实战(4)--whois与子域名爆破

目录 安全开发专栏 前言 whois查询 子域名 子域名爆破 1.4 whois查询 方式1: 方式2: 1.5 子域名查询 方式1:子域名爆破 1.5.1 One 1.5.2 Two 方式2:其他方式 总结 安全开发专栏 安全开发实战​​http://t.csdnimg.cn/25N7H 前言 whois查询 Whois 查询是一种用…

MCU功耗测量

功耗测量 一、相关概念二、功耗的需求三、测量仪器仪表测量连接SMU功能SMU性能指标 四、功耗测量注意点板子部分存在功耗MCU方面&#xff0c;可能存在干扰项仪器仪表方面 一、相关概念 静态功耗和动态功耗&#xff1a;动态功耗为运行功耗&#xff0c;功耗测量注重每MHz下的功耗…

DevOps文化对团队有何影响?

DevOps文化对团队有很多积极影响&#xff0c;包括提高团队效率、促进沟通与协作、提高产品质量和推动创新等方面。然而&#xff0c;实施DevOps文化也需要一定的挑战&#xff0c;如改变团队成员的观念、引入新的工具和流程等。因此&#xff0c;团队需要充分了解DevOps文化的价值…

【重磅开源】MapleBoot项目开发规范

基于SpringBootVue3开发的轻量级快速开发脚手架 &#x1f341;项目简介 一个通用的前、后端项目模板 一个快速开发管理系统的项目 一个可以生成SpringBootVue代码的项目 一个持续迭代的开源项目 一个程序员的心血合集 度过严寒&#xff0c;终有春日&#xff…

计算机网络-IS-IS基础配置实验

前面我们了解了IS-IS的一些基础理论&#xff0c;从建立邻接、链路状态数据库同步以及路由计算&#xff0c;现在开始学习下配置操作。 一、IS-IS配置 网络拓扑图&#xff1a; 拓扑图 IS-IS有Level级别的区分&#xff0c;Level-1可以是性能较低的设备只维护区域内的LSDB&#xff…

《R语言与农业数据统计分析及建模》学习——描述性统计分析

一、描述性统计概念和方法 1、概念和作用 描述性统计是对数据进行概括和描述&#xff0c;便于理解数据的特征、趋势和分布&#xff0c;帮助我们了解数据基本情况和总体特征&#xff0c;为后续更深入的数据分析和建模提供基础。 2、基础方法 &#xff08;1&#xff09;中心趋…

npm、yarn与pnpm详解

&#x1f525; npm、yarn与pnpm详解 &#x1f516; 一、npm &#x1f50d; 简介&#xff1a; npm是随Node.js一起安装的官方包管理工具&#xff0c;它为开发者搭建了一个庞大的资源库&#xff0c;允许他们在这个平台上搜索、安装和管理项目所必需的各种代码库或模块。 &#…

CountDownLatch源码分析

1.创建 CountDownLatch latch new CountDownLatch(5); 2.latch.countDown(); 将count执行减一操作&#xff0c;当count为0时&#xff0c;等待中的线程会被唤醒 SIGNAL (值为-1)&#xff1a; 表示后继节点需要被唤醒。当一个节点释放锁的时候&#xff0c;会唤醒它的后继节点…

openjudge_2.5基本算法之搜索_1998:寻找Nemo

题目 1998:寻找Nemo 总时间限制: 2000ms 内存限制: 65536kB 描述 Nemo 是个顽皮的小孩. 一天他一个人跑到深海里去玩. 可是他迷路了. 于是他向父亲 Marlin 发送了求救信号.通过查找地图 Marlin 发现那片海像一个有着墙和门的迷宫.所有的墙都是平行于 X 轴或 Y 轴的. 墙的厚度可…

2010-2023年“国家级大数据综合试验区”试点城市DID匹配数据

2010-2023年国家级大数据综合试验区试点城市DID匹配数据 1、时间&#xff1a;2010-2023年 2、来源&#xff1a;国家发展改革委、工业和信息化部、ZY网信办发函批复的试验区 3、指标&#xff1a;行政区划代码、年份、所属省份、地区、国家级大数据综合试验区、最早设立年份 …

ELK创建仪表盘

创建仪表盘步骤&#xff1a; 一、保存search二、生成饼图三、创建仪表盘 一、保存search 首先保存一段时间内的search&#xff0c;可以添加想要的字段&#xff0c;并保存这个search方便下次直接打开该search&#xff0c;并方便在可视化和仪表盘中使用该search. 二、生成饼图…

c++中的函数

一、函数概述 作用&#xff1a;将一段经常使用的代码封装起来&#xff0c;减少重复代码 一个较大的程序&#xff0c;一般分为若干个程序块&#xff0c;每个程序块实现特定功能。 二、函数的定义 函数定义主要有5个步骤&#xff1a; 返回值类型函数名参数列表函数体语句ret…

Laravel 6 - 第十二章 控制器

​ 文章目录 Laravel 6 - 第一章 简介 Laravel 6 - 第二章 项目搭建 Laravel 6 - 第三章 文件夹结构 Laravel 6 - 第四章 生命周期 Laravel 6 - 第五章 控制反转和依赖注入 Laravel 6 - 第六章 服务容器 Laravel 6 - 第七章 服务提供者 Laravel 6 - 第八章 门面 Laravel 6 - …

QService 服务 指令引用的“0x00000000”内存。该内存不能为“read“

QtServiceBase类在Qt框架中是设计用来简化Windows服务或类Unix守护进程创建的。这个类提供了一组方法和属性&#xff0c;使得开发者能够专注于服务逻辑&#xff0c;而不必担心操作系统层面的细节。下面是一些QtServiceBase类中常用的属性和方法&#xff1a; 常用方法 start():…

【Linux】Linux权限管理详解

&#x1f331;博客主页&#xff1a;青竹雾色间 &#x1f331;系列专栏&#xff1a;Linux &#x1f618;博客制作不易欢迎各位&#x1f44d;点赞⭐收藏➕关注 目录 1. Linux权限概念2. 文件访问者分类a) 文件和目录的访问者&#xff1a;b) 文件类型和访问权限 3. 文件权限值的表…