小星的编程笔记

  • ubuntu设置系统时区

    新安装ubuntu系统可能不是东八区

    查看当前时区  timedatectl
    
    root@xxx:~# timedatectl
                   Local time: Sun 2026-07-19 15:16:02 CST
               Universal time: Sun 2026-07-19 07:16:02 UTC
                     RTC time: Sun 2026-07-19 07:16:02
                    Time zone: Asia/Shanghai (CST, +0800)
    System clock synchronized: yes
                  NTP service: active
              RTC in local TZ: no
    
    首先将硬件时钟设为标准的 UTC 模式(消除报错警告)
    sudo timedatectl set-local-rtc 0
    
    然后设置本地时区为东八区
    sudo timedatectl set-timezone Asia/Shanghai
    
    然后查看  
    timedatectl

  • 快速释放mysql表空间

    方案一(推荐★★★★★):新建表 + 导入最近1个月数据(最快释放空间)

    这是互联网公司最常用的方法。

    例如:

    创建一个和 table1 结构完全相同的新表 table1_new,但不复制任何数据。
    
    CREATE TABLE table1_new LIKE table1;
    

    导入最近一个月:

    INSERT INTO table1_new
    SELECT *
    FROM table1
    WHERE create_at >= NOW() - INTERVAL 1 MONTH;

    确认数据:

    SELECT COUNT(*) FROM table1;
    SELECT COUNT(*) FROM table1_new;

    然后

    RENAME TABLE
    table1 TO table1_old,
    table1_new TO table1;

    观察几天没问题:

    DROP TABLE table1_old;

    立即释放50GB左右空间。

    优点

    ✅ 不会产生大量undo

    ✅ 不会锁很久(只有rename瞬间)

    ✅ DROP TABLE秒完成

    ✅ 空间立即释放

    这是MySQL官方都推荐的大表清理方式。

  • nano编辑器

    nano 的设计哲学就是简单直观。它的核心优势在于,所有常用操作都像菜单一样显示在屏幕底部,几乎不需要学习成本。

    1. 核心特点

    • 开箱即用:打开、编辑、保存、退出,所见即所得。
    • 快捷键提示:底部两行会显示最常用命令的快捷键,^ 代表 Ctrl 键,M- 代表 Meta 键(通常是 Alt 或 Esc)。
    • 轻量快速:占用资源极少,几乎在所有 Linux 系统中都预装。
    • 无模式编辑:没有 Vim 那种“插入/命令模式”的切换概念,敲下字母键就是输入。

    2. 常用操作速查

    这里的 ^ 代表 Ctrl 键。

    • 打开文件nano 文件名 或 nano -l 文件名 (-l 显示行号)
    • 保存Ctrl + O,然后按 Enter 确认。
    • 退出Ctrl + X,若有未保存修改会提示。
    • 剪切一整行Ctrl + K
    • 粘贴Ctrl + U
    • 搜索Ctrl + W,输入关键词后回车,重复按会跳到下一处。
    • 撤销/重做Alt + U 撤销, Alt + E 重做。
    • 跳转到指定行Ctrl + _ 或 Ctrl + /,然后输入行号。
    • 显示帮助Ctrl + G

    3. 进阶技巧

    • 只读模式查看文件nano -v 文件名
    • 将光标定位到特定行/列nano +行号,列号 文件名,比如 nano +10,5 test.txt
    • 平滑滚动:加上 -S 参数。
    • 设置选项永久生效:编辑 ~/.nanorc 文件,可配置语法高亮、自动缩进、鼠标支持等。例如加入 set mouse 就能启用鼠标点击定位。
  • tee命令

    tee 是一个非常实用的 Linux 命令,它的核心作用就像是一个 T 型三通管,可以把数据流同时分流到文件和屏幕上

    一、基本原理:为何叫 T 型管?

    tee 的名字来源于管道行业中的 T 型三通接头。数据从一端流入,从另外两端原样流出。

    在 Linux 中,这表现为:
    从标准输入(stdin)读取数据,然后同时写入到标准输出(stdout,通常是屏幕)和指定的一个或多个文件。

    它的基本语法是:

    command | tee [选项] 文件1 [文件2...]
    
    
    
    
    

    二、核心用途与场景

    1. 最经典的场景:记录日志并实时查看

    运行一个长时间脚本时,你既想在屏幕上看到实时输出,又想将输出保存到日志文件中以供事后排查。

    ./install_script.sh | tee install.log
    
    
    
    
    

    这样,输出既会显示在终端,又会完整地保存到 install.log 里。

    2. 追加写入,而非覆盖

    默认情况下,tee 会覆盖文件内容。如果只想追加到文件末尾,使用 -a (append) 选项。

    ls -l | tee -a file_list.txt
    
    
    
    
    

    3. 解决权限问题的利器

    这是 tee 一个非常巧妙的用法。当你使用 sudo echo "内容" > /etc/profile 时,会提示权限不足,因为重定向符号 > 是由当前的 shell 执行的,而非 sudo,sudo 只会提升 echo 的权限,而 >> 或 > 依然以普通用户的权限去写入 /etc/profile,最终会提示“权限不够 (Permission denied)”。
    利用 tee 就能完美解决:

    echo "new config line" | sudo tee /etc/some_config.conf > /dev/null
    
    # 如果不想看到屏幕输出,可以重定向到 /dev/null
    
    
    
    
    

    4. 分发数据到多个文件

    可以将一份数据同时写入多个文件,这在需要备份或处理相同数据时很高效。

    echo "important data" | tee file1.txt file2.txt backup/file3.txt
    
    
    
    
    

    5. 在管道中间调试

    在一个非常长的命令管道中,你可以插入 tee 来截获中间数据,查看管道这一步的输出是否符合预期,而不中断整个流程。

    cat access.log | grep "ERROR" | tee /tmp/error_grep.log | cut -d' ' -f1 | sort | uniq -c

    这行命令在 grep 之后,将结果一边保存到临时文件 /tmp/error_grep.log 供你检查,一边继续传递给后面的 cut 命令。

    6. 写入 /dev/null 来模拟纯传递

    如果你只想把输出写入文件,完全不想在屏幕上显示,可以把标准输出重定向到 /dev/null。这等价于普通的 > 重定向,但结合 sudo 或其它场景时会用到。

    echo "secret" | tee private.key > /dev/null
    
    
    
    
    

    三、高级用法:活用文件描述符

    tee 不仅能处理标准输出,还能借助进程替换 >(...) 把数据喂给其他命令。

    例如,你想一边看原始输出,一边实时统计行数并压缩存档:

    # 将 data 命令的输出,一边在屏幕显示,一边传给 wc -l 统计行数,一边压缩保存
    data_command | tee >(wc -l > count.txt) | gzip > data.gz
    
    
    
    
    

    再比如,同时保存原始日志和过滤后的错误日志:

    cat program.log | tee raw_output.log | grep "ERROR" > errors.log
    # 但请注意,这里管道后面的 grep 收到的数据依然是 tee 转发给标准输出的完整数据。
    # 更精确的用法是用进程替换:
    cat program.log | tee raw_output.log >(grep "ERROR" > errors.log) > /dev/null
    
    
    
    
    

    四、常用选项总结

    • -a, --append:追加到文件,而不是覆盖。
    • -i, --ignore-interrupts:忽略中断信号(Ctrl+C),这在脚本中想让 tee 优雅退出时有用。
    • -p:诊断写入到管道时的错误,非标准输出。
    • --output-error[=模式]:当写入到任何输出发生错误时的行为,模式可以是 warnwarn-nopipeexitexit-nopipe,用于更精细地控制错误处理。

    五、与其他命令的对比

    • 重定向 >:只能将输出写入文件,屏幕上无显示。
    • tee:写入文件的同时输出到屏幕(或传递给下一个命令),这是它不可替代的核心价值。
    • script 命令:可以记录整个终端会话的全部输入和输出,功能更重,适合“录屏”,而 tee 更轻量,适合处理单个命令流。

    总而言之,tee 是一个在命令行中构建数据流处理管线时不可或缺的“分流器”,掌握它能让你更灵活地监控、记录和调试命令。

  • Linux文件追加文本

    在 Linux 中,向文件末尾添加信息最常用的命令是 echo 配合重定向符 >>

    1. 最基础、最常用的命令

    使用 >> 符号,它会将内容追加到文件末尾,而不会覆盖原有内容(注意:千万不要用 >,那是覆盖文件)。

    echo "你要添加的内容" >> 文件名.txt
    echo 'export MYSQL_HOST="127.0.0.1"' >> /etc/profile

    2. 添加多行内容(使用 Here Document)

    如果您需要一次性在文件末尾追加多行内容,使用 <<EOF 语法非常方便,不需要写多个 echo

    cat <<EOF >> 文件名.txt
    第一行内容
    第二行内容
    export MYSQL_HOST="127.0.0.1"
    export MYSQL_PORT="3306"
    EOF

    (注:这里的 EOF 只是一个结束标记,您可以换成 ENDSTOP 等任意字符串,只要首尾对应即可。)


    3. 追加文件内容到另一个文件
    如果您想把 a.txt 的内容追加到 b.txt 的末尾:

    cat a.txt >> b.txt


    4. 追加内容但不换行
    默认情况下,echo 会在末尾自动加一个换行符。如果您希望追加的内容和原文件最后一行连在一起,可以使用 -n 参数:

    echo -n "不换行追加的内容" >> 文件名.txt


  • 终端常用快捷键

    删除类
    --------------------------------
    ✔ Ctrl + W
    
    👉 删除光标前一个单词
    
    ✔ Ctrl + U
    
    👉 删除光标到行首
    
    ✔ Ctrl + K
    
    👉 删除光标到行尾
    
    ✔ Ctrl + L
    
    👉 清屏
    
    --------------------------------
    移动类
    
    Home  移动到行首
    
    End   移动到行尾
    
    ✔ Alt + B
    
    👉 向左跳一个单词
    
    ✔ Alt + F
    
    👉 向右跳一个单词
    --------------------------------
    其他类
    
    ✔ Ctrl + C
    
    👉 强制终止当前命令
    
    ✔ Tab
    
    👉 自动补全(最重要)
    
    ✔ 双击 Tab
    
    👉 显示所有可选项

    windows powershell常用快捷键

    Ctrl+Home   删除到行首
    Ctrl+End    删除到行尾
    Home        移动到行首
    End         移动到行尾
    
    ✔ Ctrl + Backspace
    
    👉 删除前一个单词(⭐相当于 Linux Ctrl+W)
    
    ✔ Ctrl + Delete
    
    
    👉 删除后一个单词
    
    ✔ Ctrl + Shift + T
    
    👉 新建标签页
    
    ✔ Ctrl + Shift + W
    
    👉 关闭标签页
    
    ✔ Ctrl + Shift + C
    
    👉 复制
    
    ✔ Ctrl + Shift + V
    
    👉 粘贴
    
    

  • scp传输文件

    一、传到服务器 B(账号+密码登录)

    服务器信息

    • IP:11.22.33.44
    • 用户:root
    • 密码:12345678
    • 端口:1234
    • 本地文件:a.txt
    • 目标路径:/root/test/

    ❗标准 scp 命令

    scp  -P 1234 a.txt root@11.22.33.44:/root/test/

    ⚠️关键点(很重要)

    scp 不能直接在命令里写密码

    👉 服务器返回需要输入密码:

    root@11.22.33.44's password:

    然后手动输入:

    12345678

    二、传到服务器 C(使用密钥 s.key)

    服务器信息

    • IP: 55.66.77.88
    • 用户:root
    • 密钥:s.key
    • 端口:1234
    • 文件:a.txt
    • 目标路径:/root/test/

    ❗标准 scp(指定私钥)

    scp -P 1234 -i s.key a.txt root@55.66.77.88:/root/test

    🔥如果 key 需要权限修复(常见问题)

    chmod 600 s.key

    🚀更完整写法(推荐)

    scp -P 1234 -i s.key -o StrictHostKeyChecking=no a.txt root@55.66.77.88:/root/test/

    限制速率目标:5 MB/s

    换算:

    5 MB/s
    = 5 × 8 = 40 Mbps
    = 40000 Kbit/s

    普通密码登录版本

    scp -l 40000 a.txt root@11.22.33.44:/root/test

    2️⃣ 指定密钥版本

    scp -i s.key -l 40000 a.txt root@55.66.77.88:/root/test

    ⭐ rsync 限速(推荐)

    限速单位:KB/s(更直观)

    5 MB/s = 5120 KB/s
    rsync -avz --bwlimit=5120 a.txt root@11.22.33.44:/root/test

    ⭐ rsync + key

    rsync -avz -e "ssh -i s.key" --bwlimit=5120 a.txt root@55.66.77.88:/root/test

  • systemctl系统服务

    sudo vim /etc/systemd/system/upload_image.service
    
    编辑一下内容
    ----------------------------------------------
    
    [Unit]
    Description=上传群图片服务
    After=network.target
    
    [Service]
    Type=simple
    User=root
    WorkingDirectory=/home/xxx/qun_code
    
    ExecStart=/home/xxx/venv/bin/python3 /home/xxx/qun_code/upload_qun.py
    
    Restart=always
    RestartSec=10
    
    StandardOutput=append:/var/log/xxx.log
    StandardError=append:/var/log/xxx.log
    
    [Install]
    WantedBy=multi-user.target
    
    
    ----------------------------------------------
    systemctl --version   那个版本就可以使用file   append了  
    
    
    219  老版本只能用
    StandardOutput=journal
    StandardError=journal
    
    236可以用
    StandardOutput=file:/var/log/xxx.log
    StandardError=file:/var/log/xxx.log
    
    240可以用
    StandardOutput=append:/var/log/xxx.log
    StandardError=append:/var/log/xxx.log
    ----------------------------------------------
    
    重启服务
    
    systemctl daemon-reload
    
    systemctl enable upload_image
    
    systemctl restart upload_image
    
    systemctl status upload_image
    
    ----------------------------------------------
    旧版本查看日志
    journalctl -u upload_image.service -f
    
    journalctl -u upload_image.service -n 100
    
    journalctl -u upload_image.service --since today
    
    --------------------------------------------
    查看所有的服务
    
    systemctl list-unit-files --type=service
    
    #更加详细的信息
    systemctl list-units --type=service --all
    
    查看正在运行的
    systemctl list-units --type=service --state=active
    
    -------------------------------
    
    修改服务的名字  将 my_fast_api2 改为  my_fast_api
    
    sudo systemctl stop my_fast_api2.service
    sudo systemctl disable my_fast_api2.service
    sudo mv /etc/systemd/system/my_fast_api2.service /etc/systemd/system/my_fast_api.service
    sudo systemctl daemon-reload
    sudo systemctl enable my_fast_api.service
    sudo systemctl start my_fast_api.service
    
    
    
  • 将脚本添加为系统服务

    1. 创建服务文件

    sudo vim /etc/systemd/system/your_script.service

    内容:

    [Unit]
    Description=你的脚本简介
    After=network.target
    
    [Service]
    Type=simple
    User=root
    WorkingDirectory=/home/xiaoxing
    
    ExecStart=/bin/python3 /home/xiaoxing/your_script.py
    
    Restart=always
    RestartSec=10
    
    StandardOutput=append:/var/log/your_script.log
    StandardError=append:/var/log/your_script_error.log
    
    [Install]
    WantedBy=multi-user.target

    2. 重新加载 systemd

    systemctl daemon-reload

    3. 设置开机启动

    systemctl enable your_script

    4. 启动服务

    systemctl start your_script

    5. 查看状态

    systemctl status your_script

    实时查看日志:

    tail -f /var/log/your_script.log

    错误日志:

    tail -f /var/log/your_script_error.log
  • 解决windows电脑图标不刷新的问题

    执行下面步骤:

    1. 打开 CMD(管理员)
    taskkill /f /im explorer.exe

    del /a /q "%localappdata%\IconCache.db"
    del /a /q "%localappdata%\Microsoft\Windows\Explorer\iconcache*"

    start explorer.exe

    2. 如果是powershell 执行如下命令

    taskkill /f /im explorer.exe
    
    Remove-Item "$env:LOCALAPPDATA\IconCache.db" -Force
    Remove-Item "$env:LOCALAPPDATA\Microsoft\Windows\Explorer\iconcache*" -Force
    
    start explorer.exe