typecho 发布的文章

在Linux中根据文件内容查找文件,最常用且高效的工具是 grep(基础)和 ripgrep(进阶,速度更快),以下是可直接运行的命令示例和场景用法:

一、核心工具:grep(系统自带,无需安装)

  1. 基础用法(当前目录及子目录搜索)

bash

搜索包含"目标内容"的所有文件(递归搜索子目录)

grep -r "目标内容" ./

示例:搜索当前目录下所有文件中包含"music_player"的内容

grep -r "music_player" ./
 

  1. 常用参数(增强搜索功能)

bash

显示文件名和行号(-n 行号,-H 文件名)

grep -rnH "目标内容" ./

忽略大小写(-i)

grep -rin "目标内容" ./

只显示匹配的文件名(不显示具体内容,-l)

grep -rl "目标内容" ./

排除指定目录(--exclude-dir,如排除node_modules、.git)

grep -r --exclude-dir={node_modules,.git} "目标内容" ./

搜索特定后缀的文件(--include,如只搜.py/.sh文件)

grep -r --include="*.{py,sh}" "目标内容" ./
 

二、进阶工具:ripgrep(rg,速度比grep快10倍+)

适合大目录/多文件搜索,支持自动忽略.git/.ignore文件,Ubuntu可直接安装:

  1. 安装

bash

sudo apt update && sudo apt install ripgrep
 

  1. 常用命令(简洁高效)

bash

递归搜索当前目录,包含"目标内容"的文件(自动显示行号和文件名)

rg "目标内容" ./

只显示匹配的文件名(-l)

rg -l "目标内容" ./

忽略大小写(-i),搜索特定后缀(-g)

rg -i -g "*.py" "目标内容" ./

排除指定目录(-g !目录名)

rg -g "!node_modules" "目标内容" ./
 

三、场景化示例

1. 搜索Python脚本中包含"import pandas"的文件:

bash

grep -r --include="*.py" "import pandas" ~/projects/

或用rg更简洁:

rg -g "*.py" "import pandas" ~/projects/
 

2. 查找配置文件中包含"port=8080"的内容:

bash

grep -rnH "port=8080" /etc/
 

3. 搜索大项目中包含"TODO: 修复"的所有代码文件:

bash

rg -i "todo: 修复" ~/code/
 

在Linux(Ubuntu)中查看声音设备及声卡安装状态,用以下 4个核心命令 即可全覆盖,简单高效:

一、快速判断是否安装声卡(硬件层面)

bash

查看系统识别的音频硬件(有输出则说明有声卡)

lspci | grep -i audio # 主板集成声卡(如Intel HD Audio)
lsusb | grep -i audio # USB外置声卡(如USB麦克风/声卡)
 

  • 若两个命令均无输出,大概率是未安装声卡或驱动未识别。

二、查看系统已识别的声音设备(音频系统层面)

bash

方法1:ALSA层面(基础,系统自带)

aplay -l # 列出所有播放设备(含声卡编号、设备名)
arecord -l # 列出所有录音设备(麦克风等输入设备)

方法2:PulseAudio层面(桌面端常用,更直观)

pactl list sinks # 播放设备(对应扬声器/耳机)
pactl list sources # 录音设备(对应麦克风)
 

  • 示例输出解读: card 1: USB [USB Audio Device]  表示存在USB声卡(编号1),证明已被系统识别。

三、排查无声音设备的情况

bash

查看音频驱动加载状态

lsmod | grep snd # 有snd_xxx相关输出说明驱动已加载
sudo alsa force-reload # 重新加载音频驱动

核心原因:普通用户缺少访问声卡设备文件的权限(声卡设备文件多位于  /dev/snd/ ,默认属主为  root  和  audio  用户组)。

解决步骤(可直接执行命令):

1. 添加用户到 audio 组(永久获取权限):
bash

sudo usermod -aG audio $USER
 
2. 注销并重新登录(让组权限生效)。
3. 验证权限:
bash

查看声卡设备权限(应显示当前用户属于 audio 组)

ls -l /dev/snd/

检测声卡(普通用户下可正常识别)

aplay -l # 播放设备列表
arecord -l # 录音设备列表
 

针对 USB 声卡的额外说明:

  • USB 声卡接入后,系统会自动创建  /dev/snd/  下的对应设备文件(如  card1 、 pcmC1D0p ),权限规则与内置声卡一致,无需额外配置。
  • 若仍无法识别,可重启音频服务:
    bash

sudo systemctl restart pulseaudio

以下是 3种实用方法+Python脚本,可直接查看Linux系统中特定服务的运行状态(适配Ubuntu等主流发行版):

一、核心命令(快速执行)

1. systemctl 命令(主流推荐,适用于 systemd 系统)

bash

格式:systemctl status [服务名]

systemctl status pulseaudio # 示例:查看音频服务
systemctl status nginx # 示例:查看Nginx服务
 

  • 输出包含 运行状态(active/inactive)、PID、日志片段,红色  inactive  表示停止,绿色  active (running)  表示运行中。

2. service 命令(兼容旧系统,如 sysvinit)

bash

格式:service [服务名] status

service mysql status # 示例:查看MySQL服务

  1. ps 命令(直接查找进程,无服务名时可用)

bash

格式:ps -ef | grep [服务关键词]

ps -ef | grep pulseaudio # 示例:查找音频服务进程
ps -ef | grep python # 示例:查找Python相关进程
 

  • 有输出结果且包含  pulseaudio (非  grep  自身),说明服务正在运行。

二、Python 脚本(批量检测/自动化场景)

以下是优化后的 Linux 服务状态检测脚本,支持单服务精准查询、多服务批量检测,输出清晰且包含进程详情,可直接运行:

python

!/usr/bin/env python3

import subprocess
import sys
from typing import Tuple, Optional

def run_system_command(cmd: list) -> Tuple[int, str, str]:

"""执行系统命令,返回状态码、stdout、stderr"""
try:
    result = subprocess.run(
        cmd, capture_output=True, text=True, timeout=10
    )
    return result.returncode, result.stdout.strip(), result.stderr.strip()
except subprocess.TimeoutExpired:
    return 124, "", "命令执行超时"
except Exception as e:
    return 125, "", f"命令执行失败:{str(e)}"

def get_service_status(service_name: str) -> dict:

"""获取单个服务的详细状态(基于 systemctl)"""
status_data = {
    "service": service_name,
    "is_running": False,
    "status": "unknown",
    "pid": None,
    "description": "",
    "error": ""
}

# 1. 优先使用 systemctl 检测(主流 systemd 系统)
code, stdout, stderr = run_system_command(["systemctl", "status", service_name])
if code == 0:
    # 解析运行状态(active/inactive/failed)
    for line in stdout.split("\n"):
        line = line.strip()
        if line.startswith("Active:"):
            status_data["status"] = line.split(";", 1)[1].strip() if ";" in line else line.split()[1]
            status_data["is_running"] = "active (running)" in line
        elif line.startswith("Main PID:") and " " in line:
            status_data["pid"] = line.split()[2]
        elif line.startswith("Description:"):
            status_data["description"] = line.split(":", 1)[1].strip()
elif "Unit {} not found".format(service_name) in stderr:
    # 服务不存在,尝试用 ps 查找进程(非系统服务适用)
    code_ps, stdout_ps, _ = run_system_command(["ps", "-ef", "|", "grep", "-v", "grep", "|", "grep", service_name])
    if code_ps == 0 and stdout_ps:
        status_data["is_running"] = True
        status_data["status"] = "process running (not systemd service)"
        # 提取第一个匹配进程的 PID
        status_data["pid"] = stdout_ps.split()[1]
    else:
        status_data["error"] = "服务/进程不存在"
else:
    status_data["error"] = stderr or "未知错误"

return status_data

def print_service_status(status_data: dict) -> None:

"""格式化输出服务状态"""
service = status_data["service"]
print(f"\n=== 服务状态:{service} ===")
if status_data["error"]:
    print(f"❌ 错误:{status_data['error']}")
    return

print(f"📊 运行状态:{'✅ 正在运行' if status_data['is_running'] else '❌ 已停止'}")
print(f"🔍 详细状态:{status_data['status']}")
if status_data["pid"]:
    print(f"🆔 PID:{status_data['pid']}")
if status_data["description"]:
    print(f"ℹ️  描述:{status_data['description']}")

def main():

# 检查参数(必须传入服务名)
if len(sys.argv) < 2:
    print("用法:")
    print(f"  单服务查询:{sys.argv[0]} <服务名>")
    print(f"  多服务查询:{sys.argv[0]} <服务1> <服务2> ...")
    print("示例:")
    print(f"  {sys.argv[0]} pulseaudio nginx mysql")
    sys.exit(1)

# 批量检测传入的所有服务
service_names = sys.argv[1:]
for service in service_names:
    status = get_service_status(service)
    print_service_status(status)

print("\n=== 检测完成 ===")

if name == "__main__":

main()

 

使用方法:

1. 保存脚本为  check_service.py 
2. 赋予执行权限: chmod +x check_service.py 
3. 运行示例:
bash

单服务查询(如音频服务)

./check_service.py pulseaudio

多服务批量查询(如音频、Nginx、MySQL)

./check_service.py pulseaudio nginx mysql
 

核心功能:

  • 自动兼容  systemd  服务和普通进程(如自定义 Python 服务)
  • 输出包含「运行状态、PID、服务描述」等关键信息
  • 支持多服务批量检测,适合自动化监控场景
  • 错误提示清晰(如「服务不存在」「执行超时」)

需要添加「服务启动/停止控制」或「日志导出」功能吗?我可以帮你快速扩展脚本。

在CentOS 7中查看防火墙状态,核心是通过命令行操作 firewalld (系统默认防火墙服务),最常用的命令为:

  • 查看防火墙当前运行状态: 

    systemctl status firewalld 

  • 输出中若显示“active (running) ”,表示防火墙已开启;若显示“inactive (dead) ”,则表示已关闭。
  • 快速判断防火墙是否开启: 

    firewall-cmd --state

 

  • 直接返回“running ”(开启)或“not running ”(关闭),结果更简洁。

需要我进一步说明如何开启、关闭或重启CentOS 7的防火墙吗?这样你可以在查看状态后直接进行后续操作。

在不同系统中查看防火墙允许的端口列表,核心命令因默认防火墙工具不同而有差异,以下是最常用的两种系统操作:

  1. CentOS/RHEL 7/8(默认 firewalld)
  • 查看所有允许的端口(包括永久和临时规则):
     

    firewall-cmd --list-ports 

示例输出: 80/tcp 3306/tcp 5901/udp ,直接显示允许的端口及协议。

  • 查看永久生效的允许端口(需加  --permanent  参数):
     

    firewall-cmd --permanent --list-ports 

  1. Ubuntu/Debian(默认 ufw)
  • 查看防火墙状态及允许的端口规则:
     

    ufw status

  或  

ufw status numbered

 (带规则编号,更清晰)
示例输出: 80/tcp ALLOW Anywhere ,明确显示允许的端口、协议及来源。

需要我针对你正在使用的系统(比如之前提到的 CentOS 7),进一步说明如何添加或删除允许的端口规则吗?