Linux:/proc/kmsg 与 /proc/sys/kernel/printk_xxx
目录
- 前言
- 一、/proc/kmsg
- 1、简介
- 2、如何修改内核日志缓冲区
- 3、dmesg
- klogctl 函数(来源于 man 手册)
- 4、扩展阅读
- 二、 /proc/sys/kernel/printk_xxx
- 三、/dev/kmsg
前言
本篇文章将为大家介绍与 Linux 内核日志相关的一些控制文件,共同学习!
一、/proc/kmsg
1、简介
/proc/kmsg 是一个特殊的文件,它提供了内核消息缓冲区的访问,这个缓冲区包含了内核产生的所有消息,包括各种调试和错误信息,如内核的启动打印。/proc/kmsg 文件通常只能被 root 用户或具有相应权限的用户读取。这个文件通常被用于调试和故障排除,因为它可以提供关于内核发生事件的详细信息。

注意:这是一个缓冲区,所以其内的数据是会被刷新覆盖的!!!
一般情况下,你可以使用以下方式来使用 /proc/kmsg 文件:
1、读取内核消息:你可以使用命令行工具如 `cat` 或 `dmesg` 来查看和读取`/proc/kmsg`文件
中的内核消息。例如,使用以下命令可以显示最近的内核消息:cat /proc/kmsg
这样做可以帮助你查看内核启动时的各种信息、硬件错误、系统调试等。需要注意的是,`/proc/kmsg` 文件一般只能被 root 用户或具有相应权限的用户访问,因此在使用
时请确保你有足够的权限。此外,了解内核消息的解释和上下文对正确理解和利用 `/proc/kmsg` 中
的信息非常重要。
2、如何修改内核日志缓冲区
有时候我们发现,dmesg看到的日志信息缺少了很多,或者存储的很少,这个是因为内核日志缓冲区设置的较小,无法存储更多的内容,可以适当调整该缓冲区的大小。
建议不要调整的过大,正常的产品使用128KB即可,若是自己调试排查问题可以设置的大一点,比如2MB,根据自己的物理内存资源合理设置。

3、dmesg
/proc/kmsg 文件和 dmesg 命令之间有着紧密的关系。
/proc/kmsg 文件提供了对内核消息缓冲区的直接访问,通过读取该文件可以查看最近的内核消息。dmesg 命令是一个通用命令行工具,主要用于显示和控制内核环缓冲区。使用 dmesg 命令可以更方便地查看内核日志消息,包括从开机到当前时间内的所有内核日志消息。
实际上,dmesg 命令背后的实现原理也是通过读取 /proc/kmsg 文件来获取内核消息的。当我们在终端中执行 dmesg 命令时,它会读取 /proc/kmsg 文件的内容并将其显示在终端上。
因此,可以说 /proc/kmsg 文件是 dmesg 命令的底层实现之一。在使用 dmesg 命令的时候,实际上是在调用 /proc/kmsg 文件提供的接口来获取内核日志。

以下文件来自busybox源码:busybox\util-linux\dmesg.c
/* vi: set sw=4 ts=4: */
/*** dmesg - display/control kernel ring buffer.** Copyright 2006 Rob Landley <rob@landley.net>* Copyright 2006 Bernhard Reutner-Fischer <rep.nop@aon.at>** Licensed under GPLv2, see file LICENSE in this source tree.*/
//config:config DMESG
//config: bool "dmesg (3.7 kb)"
//config: default y
//config: select PLATFORM_LINUX
//config: help
//config: dmesg is used to examine or control the kernel ring buffer. When the
//config: Linux kernel prints messages to the system log, they are stored in
//config: the kernel ring buffer. You can use dmesg to print the kernel's ring
//config: buffer, clear the kernel ring buffer, change the size of the kernel
//config: ring buffer, and change the priority level at which kernel messages
//config: are also logged to the system console. Enable this option if you
//config: wish to enable the 'dmesg' utility.
//config:
//config:config FEATURE_DMESG_PRETTY
//config: bool "Pretty output"
//config: default y
//config: depends on DMESG
//config: help
//config: If you wish to scrub the syslog level from the output, say 'Y' here.
//config: The syslog level is a string prefixed to every line with the form
//config: "<#>".
//config:
//config: With this option you will see:
//config: # dmesg
//config: Linux version 2.6.17.4 .....
//config: BIOS-provided physical RAM map:
//config: BIOS-e820: 0000000000000000 - 000000000009f000 (usable)
//config:
//config: Without this option you will see:
//config: # dmesg
//config: <5>Linux version 2.6.17.4 .....
//config: <6>BIOS-provided physical RAM map:
//config: <6> BIOS-e820: 0000000000000000 - 000000000009f000 (usable)//applet:IF_DMESG(APPLET(dmesg, BB_DIR_BIN, BB_SUID_DROP))//kbuild:lib-$(CONFIG_DMESG) += dmesg.o//usage:#define dmesg_trivial_usage
//usage: "[-c] [-n LEVEL] [-s SIZE]"
//usage:#define dmesg_full_usage "\n\n"
//usage: "Print or control the kernel ring buffer\n"
//usage: "\n -c Clear ring buffer after printing"
//usage: "\n -n LEVEL Set console logging level"
//usage: "\n -s SIZE Buffer size"
//usage: "\n -r Print raw message buffer"#include <sys/klog.h>
#include "libbb.h"int dmesg_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int dmesg_main(int argc UNUSED_PARAM, char **argv)
{int len, level;char *buf;unsigned opts;enum {OPT_c = 1 << 0,OPT_s = 1 << 1,OPT_n = 1 << 2,OPT_r = 1 << 3};opts = getopt32(argv, "cs:+n:+r", &len, &level);if (opts & OPT_n) {if (klogctl(8, NULL, (long) level))bb_simple_perror_msg_and_die("klogctl");return EXIT_SUCCESS;}if (!(opts & OPT_s))len = klogctl(10, NULL, 0); /* read ring buffer size */if (len < 16*1024)len = 16*1024;if (len > 16*1024*1024)len = 16*1024*1024;buf = xmalloc(len);len = klogctl(3 + (opts & OPT_c), buf, len); /* read ring buffer */if (len < 0)bb_simple_perror_msg_and_die("klogctl");if (len == 0)return EXIT_SUCCESS;if (ENABLE_FEATURE_DMESG_PRETTY && !(opts & OPT_r)) {int last = '\n';int in = 0;/* Skip <[0-9]+> at the start of lines */while (1) {if (last == '\n' && buf[in] == '<') {while (buf[in++] != '>' && in < len);} else {last = buf[in++];putchar(last);}if (in >= len)break;}/* Make sure we end with a newline */if (last != '\n')bb_putchar('\n');} else {full_write(STDOUT_FILENO, buf, len);if (buf[len-1] != '\n')bb_putchar('\n');}if (ENABLE_FEATURE_CLEAN_UP) free(buf);return EXIT_SUCCESS;
}
#define EXTERNALLY_VISIBLE __attribute__(( visibility("default") ))
#define MAIN_EXTERNALLY_VISIBLE EXTERNALLY_VISIBLE`EXTERNALLY_VISIBLE` 是一个宏定义,用于通过 `__attribute__((visibility("default")))`
属性将声明的符号设置为外部可见。`__attribute__((visibility("default")))` 是 GNU C 编译器的语法扩展,可以用于指定符号
的可见性。可见性标记是用于控制符号在链接阶段的可见性,即决定符号是否能够被其他目标文件或
动态链接库访问。通常情况下,默认可见性会被应用于所有的符号。然而,如果我们想将符号标记为外部可见(即在其他
目标文件或动态链接库中可用),就需要使用 `__attribute__((visibility("default")))` 属性
来指定这一可见性。在这个宏定义中,`EXTERNALLY_VISIBLE` 用于将一个声明设置为外部可见,这意味着其他源文件或
程序可以访问该声明。这样做的一个常见原因是要提供一个公共的接口,使得其他模块或库可以使用它
。在使用这个宏定义时,通常会将它与函数、变量或类型声明一起使用,如下所示:EXTERNALLY_VISIBLE int my_function();
EXTERNALLY_VISIBLE extern int my_variable;这样一来,通过 `EXTERNALLY_VISIBLE` 宏定义,这些声明就会被设置为外部可见,可以在其他源文
件或程序中使用和访问。对于符号的可见性,有几个不同的级别,其中包括 default(默认),hidden(隐藏),protected
(受保护)和 internal(内部)等。default(默认)可见性是指符号在链接过程中会被默认导出,可以被其他目标文件或动态链接库访问
。这是最常见的可见性级别。hidden(隐藏)可见性是指符号在链接过程中不会被导出,只能在定义它的目标文件内部使用。其他
目标文件或动态链接库无法直接访问该符号。protected(受保护)可见性介于 default 和 hidden 之间,在某些情况下限制了符号的可见性,
但又允许共享库之间的访问。internal(内部)可见性是 GNU C 扩展中的一个特殊级别,用于指定符号只能在同一编译单元内
可见。这意味着该符号只能在定义它的源文件内部使用。
klogctl 函数(来源于 man 手册)
klogctl 函数用于控制内核消息日志,头文件为 #include <sys/klog.h>。它有以下原型:
int syslog(int type, char *bufp, int len);/* No wrapper provided in glibc */
int klogctl(int type, char *buf, int len);
type:指定要执行的操作类型。它可以是以下值之一:
类型参数确定此函数所执行的操作。下面的列表指定了类型的值。符号名称在内核源代码中定义,但不
导出到用户空间;您要么使用数字,或者自己实现宏定义。SYSLOG_ACTION_CLOSE (0)Close the log. Currently a NOP.SYSLOG_ACTION_OPEN (1)Open the log. Currently a NOP.SYSLOG_ACTION_READ (2)从日志中读取。该调用等待,直到内核日志缓冲区为非空,然后将最多len字节读取到bufp指向的
缓冲区中。该调用返回读取的字节数。从日志中读取的字节从日志缓冲区中消失:信息只能读取一次。
这是当用户程序读取/proc/kmsg时内核执行的函数。SYSLOG_ACTION_READ_ALL (3)读取环形缓冲区中剩余的所有消息,将它们放在bufp指向的缓冲区中。该调用从日志缓冲区读取
最后一个len字节(非破坏性),但读取的字节数不会超过自上次“清除环形缓冲区”命令以来写入缓冲
区的字节数(请参阅下面的命令5)。该调用返回读取的字节数SYSLOG_ACTION_READ_CLEAR (4)读取并清除环形缓冲区中剩余的所有消息。该调用与类型为3的调用完全相同,但也执行“清除环
形缓冲区”命令。SYSLOG_ACTION_CLEAR (5)该调用仅执行“清除环形缓冲区”命令。bufp和len参数将被忽略。此命令并不能真正清除环形
缓冲区。相反,它设置了一个内核记账变量,用于确定命令3(SYSLOG_ACTION_READ_ALL)和 4
(SYSLOG_ACTION_READ _CLEAR)返回的结果。此命令对命令2(SYSLOG_ACTION_READ)和 9
(SYSLOG_ACTION_SIZE_UNREAD)没有影响。SYSLOG_ACTION_CONSOLE_OFF (6)该命令保存console_loglevel的当前值,然后将console_log级别设置为
minimum_console_lowlevel,这样就不会向控制台打印任何消息。在Linux 2.6.32之前,该命令
只需将console_loglevel设置为minimum_console_longlevel。请参阅下面
对/proc/sys/kernel/printk的讨论。bufp和len参数将被忽略。SYSLOG_ACTION_CONSOLE_ON (7)如果执行了以前的SYSLOG_ACTION_CONSOLE_OFF命令,则此命令会将CONSOLE_loglevel恢复
为该命令保存的值。在Linux 2.6.32之前,此命令只需将console_loglevel设置为
default_console_loglevel。请参阅下面对/proc/sys/kernel/printk的讨论。bufp和len参数
将被忽略。SYSLOG_ACTION_CONSOLE_LEVEL (8)该调用将console_loglevel设置为len中给定的值,该值必须是介于1和8之间(包括1和8)的
整数。内核静默地强制len的最小值minimum_console_loglevel。有关详细信息,请参阅日志级别
部分。bufp参数被忽略。SYSLOG_ACTION_SIZE_UNREAD (9) (since Linux 2.4.10)该调用返回当前可通过命令2(SYSLOG_ACTION_READ)从内核日志缓冲区读取的字节数。bufp
和len参数将被忽略。SYSLOG_ACTION_SIZE_BUFFER (10) (since Linux 2.6.6)此命令返回内核日志缓冲区的总大小。bufp和len参数将被忽略。除3和10之外的所有命令都需要特权。在2.6.37之前的Linux内核中,命令类型3和10被允许用于
非特权进程;自Linux以来2.6.37,只有当/proc/sys/kernel/dmesg_restrict的值为0时,才允许
无特权进程使用这些命令。在Linux 2.6.37之前,“特权”意味着呼叫者具有CAP_SYS_ADMIN能力。
从Linux 2.6.37开始,“privileged”表示调用者具有CAP_SYS_ADMIN功能(现在已弃用)或(新的)
CAP_SYSLOG功能。
buf:用于读取或写入内核日志的缓冲区。len:长度。
klogctl 函数允许您控制内核消息日志的操作,例如打开或关闭日志记录,读取最近的日志消息或将消息写入日志中。您可以使用相关的 type 值执行不同的操作,并通过 buf 参数进行数据的读取或写入。需要注意的是,klogctl 函数仅在 Linux 系统中可用,且需要以管理员权限运行。
/proc/sys/kernel/printk:
/proc/sys/kernel/printk是一个可写文件,包含四个整数值,这些整数值在打印或记录错误
消息时会影响内核printk()的行为。这四个值是:console_loglevel只有日志级别低于此值的消息才会打印到控制台。该字段的默认值为default_CONSOLE_LOGLEVEL
(7),但如果内核命令行包含单词“quiet”,则将其设置为4;如果内核命令行将包含单词“debug”,
则设置为10;如果出现内核故障,则设置至15(10和15只是愚蠢的,相当于8)。console_loglevel
的值可以通过类型为8的syslog()调用设置(设置为1–8范围内的值)。default_message_loglevel此值将用作没有显式级别的printk()消息的日志级别。在Linux 2.6.38之前(包括该版本),
该字段的硬编码默认值为4(KERN_WARNING);自Linux 2.6.39以来,默认值是由内核配置选项
CON-FIG_default_MESSAGE_LOGLEVEL定义的,默认值为4。minimum_console_loglevel此字段中的值是可以设置console_loglevel的最小值。default_console_loglevel这是console_loglevel的默认值。内核日志的打印级别:Kernel constant Level value MeaningKERN_EMERG 0 System is unusableKERN_ALERT 1 Action must be taken immediatelyKERN_CRIT 2 Critical conditions,关键/临界条件KERN_ERR 3 Error conditionsKERN_WARNING 4 Warning conditionsKERN_NOTICE 5 Normal but significant conditionKERN_INFO 6 InformationalKERN_DEBUG 7 Debug-level messages
返回值对于调用为2、3或4的类型,成功调用syslog()将返回读取的字节数。对于类型9,syslog()
返回当前可在内核日志缓冲区上读取的字节数。对于类型10,syslog()返回内核日志缓冲区的总大
小。对于其他类型的值,成功时返回0。如果出现错误,则返回-1,并设置errno以指示错误。错误码EINVAL:错误的参数(例如,错误的类型;或对于类型2、3或4,buf为NULL,或len小于零;
或者对于类型8,级别在1到8).ENOSYS:此syslog()系统调用不可用,因为编译内核时禁用了CONFIG_PRINTK内核配置选项。EPERM:没有足够权限的进程试图更改console_loglevel或清除内核消息环形缓冲区(更准确地
说:没有CAP_SYS_ADMIN或CAP_SYSLOG能力)。ERESTARTSYS:系统调用被信号中断;什么也没读。(这只能在跟踪过程中看到)
4、扩展阅读
linux日志:syslogd和klogd及syslog
二、 /proc/sys/kernel/printk_xxx
这些是 Linux 内核的一些控制文件,用于配置内核日志和打印设置。下面是对这些文件的详细解释:
-
/proc/sys/kernel/printk- 该文件用于控制内核日志的打印级别。它包含四个整数值(以空格分隔),分别表示控制台日志级别、默认控制台日志级别、启动日志级别和当前日志级别。
-
/proc/sys/kernel/printk_devkmsg- 如果该文件的值为非零,则内核日志将通过
/dev/kmsg设备输出。如果为零,则内核日志将不会输出到该设备。默认情况下,它的值为非零。
- 如果该文件的值为非零,则内核日志将通过
-
/proc/sys/kernel/printk_delay- 该文件用于设置内核日志的打印延迟时间(以毫秒为单位)。这个延迟时间用于合并相邻的日志消息,以减少日志输出的开销。
-
/proc/sys/kernel/printk_ratelimit- 该文件用于设置内核日志输出的限速,即每秒打印的消息数量限制。默认情况下,它的值为
5。
- 该文件用于设置内核日志输出的限速,即每秒打印的消息数量限制。默认情况下,它的值为
-
/proc/sys/kernel/printk_ratelimit_burst- 该文件用于设置内核日志限速突发打印的数量。当达到限速后,内核可以突发打印多少条日志消息。默认情况下,它的值等于
10 * printk_ratelimit。
- 该文件用于设置内核日志限速突发打印的数量。当达到限速后,内核可以突发打印多少条日志消息。默认情况下,它的值等于
这些文件的值可以通过读取和写入这些文件来进行配置。例如,要更改内核日志的打印级别,可以使用以下命令:
echo "<console_loglevel> <default_console_loglevel> <boot_loglevel> <current_loglevel>" > /proc/sys/kernel/printk
其中,每个<loglevel>代表一个整数,表示对应的日志级别。需要注意的是,对这些控制文件的更改只对当前会话有效,重新启动系统后会恢复为默认值。如果您希望在系统启动时保持更改的值,可以在启动脚本中设置这些文件的值。
三、/dev/kmsg
/dev/kmsg 是 Linux 操作系统中的一个特殊设备文件,用于读取内核日志。它在内核中用于与用户空间的程序进行通信,并提供了对内核消息缓冲区的访问。
通过读取 /dev/kmsg,您可以获取内核在运行时生成的各种日志消息,包括内核启动消息、驱动程序消息、错误消息等。这对于诊断系统问题、调试内核模块或了解系统运行状况非常有用。
为了访问 /dev/kmsg,您可以使用标准的读取文件的方法,例如使用 open 函数打开设备文件,然后使用 read 函数读取其中的数据。示例代码如下:
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>#define BUF_SIZE 1024int main()
{int fd = open("/dev/kmsg", O_RDONLY);if (fd == -1){perror("Failed to open /dev/kmsg");return 1;}char buffer[BUF_SIZE];ssize_t bytesRead;while ((bytesRead = read(fd, buffer, BUF_SIZE - 1)) > 0){buffer[bytesRead] = '\0';printf("%s", buffer);}close(fd);return 0;
}
上述代码将打开 /dev/kmsg,然后使用一个循环不断读取内核日志信息,将其打印到标准输出上直至读取完毕。请注意,读取 /dev/kmsg 通常需要 root 权限或者使用 sudo 运行程序。
需要注意的是,读取 /dev/kmsg 的方式是阻塞的,也就是说,如果没有新的消息,读取操作将会一直阻塞,直到有新的消息到达。因此,该方式通常用于长期运行或守护进程,以便可以实时监控内核日志。
summary:/proc/kmsg 是一个虚拟文件,/dev/kmsg 是一个设备文件,也用于读取内核日志消息。/proc 下的虚拟文件主要用于提供内核状态和动态信息,而 /dev 下的设备文件主要用于与硬件设备进行交互。
欢迎大家指导和交流!如果我有任何错误或遗漏,请立即指正,我愿意学习改进。期待与大家一起进步!
相关文章:
Linux:/proc/kmsg 与 /proc/sys/kernel/printk_xxx
目录 前言一、/proc/kmsg1、简介2、如何修改内核日志缓冲区3、dmesgklogctl 函数(来源于 man 手册) 4、扩展阅读 二、 /proc/sys/kernel/printk_xxx三、/dev/kmsg 前言 本篇文章将为大家介绍与 Linux 内核日志相关的一些控制文件,共同学习&am…...
使用 Postman 发送 get 请求的简易教程
在API开发与测试的场景中,Postman 是一种普遍应用的工具,它极大地简化了发送和接收HTTP请求的流程。要发出GET请求,用户只需设定正确的参数并点击发送即可。 如何使用 Postman 发送一个GET请求 创建一个新请求并将类型设为 GET 首先&#…...
【网站项目】基于jsp的拍卖网站设计与实现
🙊作者简介:多年一线开发工作经验,分享技术代码帮助学生学习,独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。🌹赠送计算机毕业设计600个选题excel文件,帮助大学选题。赠送开题报告模板ÿ…...
为什么洗衣机会每天自动上传3.6GB数据?
“为什么我家的LG洗衣机每天都会上传3.6GB的数据?” 一位名为Johnie用户发现他家电设备的异常行为后表示很不理解,随后他把相关信息发布在X平台,很快这篇帖子就收获了超过1700万次的浏览量,并迅速变成一场争议和网络安全battle。…...
word写标书的疑难杂症总结
最近在解决方案工作,与office工具经常打交道,各种问题,在此最下记录: 1.word中文档距离文档顶端有距离调整不了 1.疑难杂症问题1,多个空格都是不能解决 #解决办法:word中--布局-下拉框---“版式”--“垂直…...
2024,会更好嘛?
2023转眼过去,从1月的前端,2月的java,3月的数据库,4月的运维,我尝试了许多技术方向,终究在2023年5月,凭着背的Java面试题,拿到了三四个offer。2023年6月,边玩边整自己的毕…...
Nsis打包Unity Exe文件(通用)
Nsi 脚本 !include "MUI2.nsh"#使用现代UI Unicode true #使用Unicode !define EXENAME "exeName" #定义常量 exe名称 !define SHORTCUT "快捷方式名称" #定义桌面快捷方式的中文名称Name ${EXENAME} #安装程序的title OutFile "${EXENAME…...
【Azure 架构师学习笔记】- Azure Databricks (6) - 配置Unity Catalog
本文属于【Azure 架构师学习笔记】系列。 本文属于【Azure Databricks】系列。 接上文 【Azure 架构师学习笔记】- Azure Databricks (5) - Unity Catalog 简介 UC的关键特性 之所以DataBricks要用UC, 很大程度是对安全的管控。从上文可以了解到它的四大特性&#…...
redis7部署集群:包含主从模式、哨兵模式、Cluster集群模式等三种模式
前言: redis部署集群常见的一般有三种模式:主从模式,Sentinel(哨兵模式),Redis Cluster(高可用Cluster集群),根据不同的需求可自定义选择部署方式。 Redis 主从模式&…...
072:vue+mapbox 点击某图层feature,高亮这部分
第072个 点击查看专栏目录 本示例是介绍如何在vue+mapbox中点击某图层feature,高亮这部分。思路是通过点击,获取点击部分的feature信息,生成一个新的source和layer,如果这个图层不为空,则清除之,相当于点击了别的地方,原有的高亮会删除掉,在别的地方高亮。 直接复制下…...
2024年最新安全且稳定的大数据传输方式
随着大数据时代的兴起,数据传输的速度和效率已经成为企业竞争的关键因素。到了2024年,大数据传输领域迎来了新的趋势和挑战,同时也涌现出了一系列创新的解决方案。本文将深入探讨这些新趋势和解决方案,意在帮助企业更好地迎接大数…...
Docker 数据卷容器
docker在容器中管理数据主要有两种方式: 数据卷(Volumes)挂载主机目录(Bind mounts) 而每个容器的数据都是独立的,数据跟随着容器的生命周期。如mysql容器,如果容器被删除了所有的数据都会丢失…...
深度学习记录--梯度检验
数值逼近 为了对梯度进行检验,需要计算近似误差值来接近梯度 对于单边误差和双边误差公式,其中双边误差与真实梯度相差更小,故一般采用双边误差公式 双边误差 公式: 梯度检验(gradient checking) 对于成本函数,求出…...
ERP进出库+办公用品管理系统
系统架构 简介系统架构部分页面结构图UML逻辑图办公用品入出库 简介 本系统适用于ERP企业公司职员关于系统化的申请相关办公用品,提高整体系统整合行,加大上下级之间的联系,规避因人员过多,而浪费人力在简单重复的工作中…...
Redis 笔记一
概览 1.Redis核心数据存储结构 2.Redis底层String编码int&embstr&raw 3.Redis底层压缩列表&跳表&哈希表 4.Redis底层Zset实现压缩列表和跳表如何选择 5.基于Redis实现微博&抢红包&12306核心业务 辅助学习:Redis 教程 | 菜鸟教程 1.Redis为什…...
学习记录687@spring data jpa 动态传递list参数并判断list是否为空
实际应用中需要在spring data jpa中使用原生sql,传递的参数是list,要根据list判断是否为空来判断是否要使用这个参数。 尝试了很多方法,比如size、length、is null、!null等等,都要报错,比如could not extract Result…...
寒假刷题第五天
PTA甲级 1022 Digital Library 大模拟 #include<iostream> #include<unordered_map> #include<unordered_set> #include<vector> #include<set>using namespace std;unordered_map<string , set<int>>ti , au , key , pub , year…...
Leetcode454四数相加Ⅱ(java实现)
今天,我们分享的题目是Leetcode454四数相加Ⅱ,我们先来看题目: 首先可以从题意中大体得知,也是从某个集合中找有没有符合条件的元素。遇见这种类型的题目我们可以考虑用哈希表,本题我们选取的是map集合,因…...
mysql 容器化安装(docker)离线和在线
前言:在部署hive或airflow 升级过程中,总需要一个对应的数据库存储元数据,一个轻量级的mysql容器刚刚好。轻量、可快速移植、具有隔离性。 文章目录 1、查看机器版本2、安装 docker3、启动docker 服务4、docker 常用命令docker5、拉取mysql …...
2. FPGA的电路结构概述
文章目录 1. 引言2. FPGA的一般结构2.1 概要2.2 FPGA三部分构成间的关系: 3. 小结 1. 引言 结构决定原理。原理未必决定结构。理解FPGA结构,进而能阐明其工作原理很有必要。FPGA产品的风云变换,其基本结构保持相对不变。 2. FPGA的一般结构…...
Vue记事本应用实现教程
文章目录 1. 项目介绍2. 开发环境准备3. 设计应用界面4. 创建Vue实例和数据模型5. 实现记事本功能5.1 添加新记事项5.2 删除记事项5.3 清空所有记事 6. 添加样式7. 功能扩展:显示创建时间8. 功能扩展:记事项搜索9. 完整代码10. Vue知识点解析10.1 数据绑…...
【Linux】shell脚本忽略错误继续执行
在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
从深圳崛起的“机器之眼”:赴港乐动机器人的万亿赛道赶考路
进入2025年以来,尽管围绕人形机器人、具身智能等机器人赛道的质疑声不断,但全球市场热度依然高涨,入局者持续增加。 以国内市场为例,天眼查专业版数据显示,截至5月底,我国现存在业、存续状态的机器人相关企…...
《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》
在注意力分散、内容高度同质化的时代,情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现,消费者对内容的“有感”程度,正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中࿰…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包
文章目录 现象:mysql已经安装,但是通过rpm -q 没有找mysql相关的已安装包遇到 rpm 命令找不到已经安装的 MySQL 包时,可能是因为以下几个原因:1.MySQL 不是通过 RPM 包安装的2.RPM 数据库损坏3.使用了不同的包名或路径4.使用其他包…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
Python 训练营打卡 Day 47
注意力热力图可视化 在day 46代码的基础上,对比不同卷积层热力图可视化的结果 import torch import torch.nn as nn import torch.optim as optim from torchvision import datasets, transforms from torch.utils.data import DataLoader import matplotlib.pypl…...
大数据治理的常见方式
大数据治理的常见方式 大数据治理是确保数据质量、安全性和可用性的系统性方法,以下是几种常见的治理方式: 1. 数据质量管理 核心方法: 数据校验:建立数据校验规则(格式、范围、一致性等)数据清洗&…...
