编程笔记

lifelong learning & practice makes perfect

journalctl 是 Linux 系统上用于查询和管理 systemd 日志的命令行工具。 它提供了一种强大的方式来访问、过滤和分析系统日志,这对于诊断问题、监控系统性能以及审计安全事件至关重要。

以下是 journalctl 的一些主要作用和用法:

1. 查看系统日志:

  • 查看所有日志:

    1
    journalctl

    这将显示自系统启动以来的所有日志消息。

  • 查看最近的日志:

    1
    journalctl -n <数量>

    例如,journalctl -n 10 显示最近的 10 条日志消息。

  • 实时查看日志 (类似于 tail -f):

    1
    journalctl -f

    实时显示新的日志消息,直到按下 Ctrl+C。

2. 基于时间过滤日志:

  • 查看特定时间后的日志:

    1
    2
    3
    4
    journalctl --since "<日期时间>"
    journalctl --since "today"
    journalctl --since "yesterday"
    journalctl --since "2023-10-27 10:00:00"
  • 查看特定时间之前的日志:

    1
    2
    3
    journalctl --until "<日期时间>"
    journalctl --until "tomorrow"
    journalctl --until "2023-10-27 12:00:00"
  • 查看特定时间范围内的日志:

    1
    journalctl --since "2023-10-27 08:00:00" --until "2023-10-27 18:00:00"

3. 基于单元 (Unit) 过滤日志:

  • 查看特定服务的日志:

    1
    2
    journalctl -u <单元名称>
    journalctl -u nginx.service
  • 查看特定进程的日志 (通过 PID):

    1
    2
    journalctl _PID=<进程ID>
    journalctl _PID=1234
  • 查看特定用户启动的单元的日志:

    1
    2
    journalctl --user-unit <单元名称>
    journalctl --user-unit myapp.service

4. 基于优先级 (Priority) 过滤日志:

  • 查看特定优先级的日志:

    1
    journalctl -p <优先级>

    优先级包括:

    • emerg (紧急)
    • alert (警报)
    • crit (严重)
    • err (错误)
    • warning (警告)
    • notice (注意)
    • info (信息)
    • debug (调试)

    例如,查看所有错误和更严重级别的日志:

    1
    journalctl -p err
  • 查看特定优先级及以上级别的日志:

    1
    2
    journalctl -p err..crit  # 错误级别到严重级别
    journalctl -p err+ # 错误级别及以上级别 (包括严重,警报,紧急)

5. 基于内核日志:

  • 查看内核日志:

    1
    journalctl -k
  • 查看特定时间的内核日志:

    1
    journalctl -k --since "yesterday"

6. 输出格式化:

  • 以短格式输出 (默认):

    1
    journalctl
  • 以详细格式输出:

    1
    journalctl -o verbose
  • 以 JSON 格式输出:

    1
    journalctl -o json
  • 以 JSON-pretty 格式输出:

    1
    journalctl -o json-pretty
  • 以导出格式输出 (二进制,可用于传输):

    1
    journalctl -o export
  • 以猫格式输出 (最小化信息,适合管道传输):

    1
    journalctl -o cat

7. 其他功能:

  • 显示磁盘空间使用情况:

    1
    journalctl --disk-usage
  • 清理旧日志 (归档):

    1
    2
    journalctl --vacuum-time=2weeks  # 删除两周前的日志
    journalctl --vacuum-size=1G # 保留 1GB 的日志
  • 设置日志持久化 (如果 /var/log/journal 目录不存在,则创建):

    1
    2
    sudo mkdir -p /var/log/journal
    sudo systemctl restart systemd-journald

    重启服务后,systemd-journald 将持久化日志到磁盘。

总结:

journalctl 是一款非常强大的工具,它可以帮助你:

  • 诊断系统问题和应用程序错误。
  • 监控系统性能和资源使用情况。
  • 审计安全事件。
  • 跟踪系统启动和关闭过程。
  • 了解系统的行为和状态。

熟练使用 journalctl 是 Linux 系统管理员和开发人员的一项重要技能。 通过各种选项,你可以精确地筛选和分析系统日志,从而快速定位和解决问题。 使用 man journalctl 命令查看完整的文档和选项列表。

RANK 在 MySQL 8.0 及更高版本中是关键字,它是一个窗口函数,用于计算行在一组结果集中的排名。

RANK() 函数的语法:

1
2
3
4
RANK() OVER (
[PARTITION BY column1, column2, ...]
ORDER BY column3 [ASC | DESC], column4 [ASC | DESC], ...
)

解释:

  • RANK(): 这是窗口函数本身。
  • OVER(): 指定窗口函数的操作方式。
  • PARTITION BY column1, column2, ...: (可选) 将结果集分成多个分区。 RANK() 函数将在每个分区内独立计算排名。 如果没有指定 PARTITION BY 子句,则整个结果集被视为一个分区。
  • ORDER BY column3 [ASC | DESC], column4 [ASC | DESC], ...: 指定每个分区内数据的排序方式。 RANK() 函数基于此排序来计算排名。 ASC 表示升序(默认),DESC 表示降序。

RANK() 函数的工作原理:

RANK() 函数会为每个分区(或整个结果集,如果没有 PARTITION BY 子句)中的每一行分配一个排名。 排名是基于 ORDER BY 子句指定的排序顺序计算的。 如果有多行具有相同的排序值,它们将获得相同的排名,并且下一个排名将会跳过相同的数量。

示例:

假设我们有一个名为 employees 的表,包含以下数据:

employee_id employee_name department salary
1 Alice Sales 60000
2 Bob Sales 70000
3 Charlie Marketing 55000
4 David Marketing 55000
5 Eve Sales 70000
6 Frank Marketing 80000

1. 计算所有员工的薪水排名:

1
2
3
4
5
6
7
SELECT
employee_id,
employee_name,
salary,
RANK() OVER (ORDER BY salary DESC) AS salary_rank
FROM
employees;

结果:

employee_id employee_name salary salary_rank
6 Frank 80000 1
2 Bob 70000 2
5 Eve 70000 2
1 Alice 60000 4
3 Charlie 55000 5
4 David 55000 5

注意:Bob 和 Eve 具有相同的薪水,因此它们都获得了排名 2。下一个排名是 4,跳过了 3。 Charlie和David工资相同,排名也相同,下一个排名是6.

2. 计算每个部门内员工的薪水排名:

1
2
3
4
5
6
7
SELECT
employee_id,
employee_name,
department,
RANK() OVER (PARTITION BY department ORDER BY salary DESC) AS department_salary_rank
FROM
employees;

结果:

employee_id employee_name department salary department_salary_rank
6 Frank Marketing 80000 1
3 Charlie Marketing 55000 2
4 David Marketing 55000 2
2 Bob Sales 70000 1
5 Eve Sales 70000 1
1 Alice Sales 60000 3

注意: PARTITION BY department 子句将员工分成 Sales 和 Marketing 两个分区。 RANK() 函数分别在每个分区内计算薪水排名。 Bob 和 Eve 在 Sales 部门内具有相同的薪水,因此都获得了排名 1。 Charlie和David在Marketing部门内工资相同,因此都获得排名2.

RANK(), DENSE_RANK(), ROW_NUMBER() 的区别:

  • RANK(): 如果有多行具有相同的排序值,它们将获得相同的排名,并且下一个排名将会跳过相同的数量。 例如:1, 2, 2, 4, 5, 5, 5, 8…
  • DENSE_RANK(): 如果有多行具有相同的排序值,它们将获得相同的排名,但下一个排名不会跳过。 例如:1, 2, 2, 3, 4, 4, 4, 5…
  • ROW_NUMBER(): 为结果集中的每一行分配一个唯一的序列号,从 1 开始。 即使多行具有相同的排序值,它们也会获得不同的排名。 例如: 1, 2, 3, 4, 5, 6, 7, 8…

何时使用 RANK()

当你想知道某个值在一组值中的相对位置,并且需要处理具有相同值的行时,可以使用 RANK()。 常见用例包括:

  • 确定前 N 名学生、产品或员工。
  • 比较不同类别中的值。
  • 创建排行榜。

总结:

RANK() 是一个强大的窗口函数,可用于计算 MySQL 结果集中行的排名。 通过 PARTITION BYORDER BY 子句,你可以灵活地定义如何计算排名。 了解 RANK(), DENSE_RANK()ROW_NUMBER() 之间的区别,可以帮助你选择最适合特定需求的函数。

This article summarizes methods for jailbreaking LLM, focusing on techniques from the BEST-OF-N JAILBREAKING paper.总结了大模型越狱的方法,重点介绍了BEST-OF-N JAILBREAKING 论文和米斯特安全团队的Prompt越狱手册中的技术。

阅读全文 »

This article covers OpenAI's Responses API updates (MCP, image generation, code interpreter), Cline's Workflows and Rules, B站's Index-AniSora and Index-TTS models, the Awsome-Manus website, 砺算科技's GPU, and Q1 2025 China smartphone sales.文章介绍了OpenAI的API更新(MCP,Image Generation,Code解释器),Cline的工作流和规则,B站索引 - anisora和Index-TTS模型,Awsome-Manus网站,GPU和国内2025年Q1季度智能手机销量/市占率等数据。

阅读全文 »

A weekly summary of interesting links and topics, including a MCP translation tool, DeepLX, education resources, automotive regulations, and GitHub acceleration.

阅读全文 »

本文介绍了如何使用阿里云快照快速复制系统环境,以及如何解决使用自定义镜像后服务器始终显示“操作系统启动中”的问题。This article describes how to use Alibaba Cloud snapshots to quickly replicate a system environment, and how to solve the problem of the server always displaying 'Operating system starting' after using a custom image.

阅读全文 »