命令行工具整理
名称 | 作用 |
mosh | UDP 控制的、可自动重连的 ssh 客户端 |
rigrep | 更简单的 grep |
fd | 更简单的 find |
fzf | 模糊搜索工具 |
mycli | 带补全功能的 mysql 客户端 |
jq | json cli 工具 |
axel | 多线程下载 |
htop | 监控工具 |
tmux | 终端复用工具 |
cppman | c++ 手册查询工具 |
tldr | 以用例为主的manpage |
figlet | 生成 ASCII 字符画 |
powertop | 查看电源信息 |
ImageMagick
为图片添加带下划线的字体 :
convert -pointsize 20 -fill Red -draw "decorate UnderLine text 145,190 '20µm'" in.png out.png
in.png 和 out.png 可同名 |
Pandoc
指定输出格式
对于某些格式而言,其可能具有多种变体(比如 MarkDown ),我们可以使用 -t
选项指定某一种变体以获得更好的观感:
例如对于 rst 而言,其默认的 markdown 就会出现明显的格式错误,这时我们可以使用 gfm 变体:
pandoc 1.rst -t gfm -o 1.md
对于 markdown 而言,其变体有:
变体 | 变体说明 |
commonmark | |
commonmark_x | CommonMark Markdown with extensions |
gfm | |
markdown (默认) | |
markdown_mmd | |
markdown_phpextra | |
markdown_strict |
一般而言, 对于 Python 工具链而言, CommonMark 是支持最广泛的语法,但是对于各种应用软件而言,GFM 已经成为事实上的标准。
另外一个问题是 pandoc 可能会添加一些格外的换行。可以通过 --warp=none
删除。
wget
批量下载文件
情形如下:[1]
需要下载指定网页内的资源
需要将网页下载到指定文件夹
代码:
wget -r -l1 -nd -A"zip,pdf,mdd" url
上述代码的意思为:
-r -l1 :递归下载网页,递归层数为 1
-nd :不创建文件夹
-A"zip,pdf,mdd" :只下载 zip、pdf、mdd 文件
html 文件是肯定需要下载的。但是如果不需要的话会保存为 html.tmp 文件。在不需要 html 文件时其会被删除。 |
Proton
要执行 Proton,需要两个关键的环境变量:
STEAM_COMPAT_CLIENT_INSTALL_PATH 指向 steam 配置路径,一般为
${HOME}/.steam/steam
STEAM_COMPAT_DATA_PATH 指向游戏的 Proton 路径,一般为
…/SteamLibrary/steamapps/compatdata/${APPID}
其中,如果路径 STEAM_COMPAT_DATA_PATH 不存在,需要自行创建
这样,一个 Proton 的运行形式为 xxxx/proton command
,可用的命令为:
run: 运行 Proton,如果 STEAM_COMPAT_DATA_PATH 是空路径,则自动创建 WINE_PREFIX
runinprefix: 在 STEAM_COMPAT_DATA_PATH/pfx 中运行 wine。后面直接跟 wine 的命令
ffmpeg 使用
常见参数
-i
: 后接文件名-s
:指定分辨率-r
:指定帧率-b
:指定比特率-ac
:指定声道数-ar
:指定采样率。一般有 11025、22050、24000、44100、48000 五个等级-b:a
:audio 比特率-ss
:开始时间-codec copy
:指定编码方式
由于 ffmpeg 使用了关键帧技术加速转换,在剪切视频时时间可能不对,这时可以使用 ffmpeg -i video.mp4 -ss 134.0
而不是 ffmepg -ss 134.0 -i video.mp4
去除视频中的声音:-vcode copy -an
GDB
GDB 调试器的使用
前提需求
如果是使用 GCC 编译程序的时候,需要使用 -ggdb3 -Wall 参数
如果是使用 CMake,则 CMAKE_BUILD_TYPE 需要设置为Debug/RelWithDebInfo
另外,调试时如果用到了动态库,gdb 会自动下载动态库的 debuginfo。对于 Fedora 而言,还可以使用 dnf debuginfo-install
手动安装。包名与提供动态库的包名相同
设置断点
gdb 通过 breakpoint 进行打断点,此指令的简写形式为 break、b。命令格式为 :
break location break location if cond
其中 location 的值为:
location | 含义 |
行号 | 入口函数所在文件的行号 |
文件名:行号 | 指定文件的行号 |
函数名 | 在函数内部的第一行代码暂停 |
文件名:函数名 | 在执行指定文件的指定函数时暂停 |
此外,上述所有 location 都可以接 location offset
的形式进行偏移。offset 可为正负,单位为行
命令 | 做用 |
d [n] | 删除所有断点或者删除 n 号断点 |
clear [行号] | 删除指定行断点 |
disable | 禁用断点 |
enable | 启用断点 |
info breakpoints | 查看断点 |
运行代码
执行有两种方式:
命令 | 作用 |
run | 直接运行到断点 |
start | 在 main() 处中断 |
next | Step Over |
step | Step Into |
cont | 执行到下一个断点 |
查看运行时信息
bt | 显示栈帧 |
bt full | 显示局部变量 |
print/p | 计算并打印表达式的结果 |
display | 跟踪表达式的结果 |
info reg | 查看寄存器内容 |
watch | 表达式变化时暂停 |
awatch | 表达式 rw 时暂停 |
rwatch | 表达式 r 时暂停 |
step | 修改变量的值 |
多线程如何调试?
线程里直接加个 while(true) 等线程开始后 attach 进去,然后手动退出循环
[Linux gdb 单步执行和跟踪函数调用_shiawaseli的博客-CSDN博客_gdb单步跟踪]
进程调试
命令 | 作用 |
info proc | 查看进程信息 |
set follow-fork-mode parent/child | fork 后跟踪 parent/child 的代码 |
set detach-on-fork off | fork后暂停 parent 的代码 |
catch exec | 在 fork/exec 函数后面打断点 |
GDB 脚本
将 gdb 调试过程写入一个文件中,就成为了一个 gdb 脚本。此脚本可在启动时通过参数 -x 引入,以自动完成某些工作。例如:
b threadpool.cpp:8
run
b if terminate_ == true
c
然后通过命令 gdb ./build/Debug/threadpool_test -x ./debug.gdb
启动命令即可
调试 Core 文件
首先拷贝并解压 Core 文件 :
cp /var/lib/systemd/coredump/core.test_threadpool.zst . extract core.test_threadpool.zst
然后使用 gdb ./build/Debug/threadpool_test core.test_threadpool
开始调试。之后可以通过 bt 查看栈帧
跟踪过程调用
有三个相关工具:strace, ltrace 和 ftrace 分别用于跟踪系统调用、用户态程序调用和所有函数调用
多线程调试
多线程情况下崩溃有以下几种原因:
对失效的锁(对象失效)调用了 lock
加锁解锁顺序不对
加锁解锁不在同一线程中
对无锁的锁尝试解锁
动态库调试
动态库的调试与普通二进制文件的调试差不多,在加载可执行文件后,直接通过 breakpoint function_name 打断点,之后出现的提示选 y,正常执行即可
信号
信号使用 handle 指令。格式为:
handle signal mode
其中 signale 为:
all SIGINT ...
mode 为:
mode | 作用 |
---|---|
nostop | 当信号发生时,GDB 不会暂停程序,其可以继续执行,但会打印出一条提示信息,告诉我们信号已经发生; |
stop | 当信号发生时,GDB 会暂停程序执行。 |
noprint | 当信号发生时,GDB 不会打印出任何提示信息; |
当信号发生时,GDB 会打印出必要的提示信息; | |
nopass(或者 ignore) | GDB 捕获目标信号的同时,不允许程序自行处理该信号; |
pass(或者 noignore) | GDB 调试在捕获目标信号的同时,也允许程序自动处理该信号。 |
tmux
tmux 是终端复用器。可以在断开与服务器的连接后依然执行任务
tmux 依赖于一系列快捷键,其默认前缀键是 Ctrl+b
tmux 的基本配置
下面是我的 tmux 的配置。配置文件位于 ~/.tmux.conf
:
# 真彩色
set -g default-terminal "screen-256color"
set-option -ga terminal-overrides ",*256col*:Tc"
set-option -g mouse on
unbind "Enter"
bind Enter splitw -h -c '#{pane_current_path}'
unbind "n"
bind n splitw -v -c '#{pane_current_path}'
unbind "k"
bind k kill-session
快捷键
下面是一些常用快捷键:
会话类:
快捷键 | 作用 |
| 在会话之间进行转换 |
| 与当前会话分离 |
| 杀死当前会话 |
在退出 tmux 后,可以使用 tmux a attach 到退出前的会话上
窗口类:
快捷键 | 作用 |
| 创建新窗口 |
| 切换到下一个窗口 |
| 在窗口之间进行转换 |
面板类:
快捷键 | 作用 |
| 左右分隔面板 |
| 上下分隔面板 |
| 当前窗格全屏现实,再按一次恢复 |
| 切换到下一个窗格 |
去除 <200b>
sed 's/\xe2\x80\x8b//g' inputfile
keepalived
keepalived 是高可用方案。最常见的使用场景是主从备份,当主机挂掉时让备份机自动顶替。但是在使用时有几点需要注意:
同一个局域网内的多台主机可以拥有同一个 VIP
状态为 MASTER 的机器会抢占状态为 BACKUP 的机器的 VIP
优先级越高,机器获得 VIP 的次序越高
默认情况下 keepalived 不允许开多个进程。解除限制需要修改源码
vrrp 是 未知组播
如果在 Master 重启后不希望抢占 Backup 的 VIP,就需要将 Master 和 Backup 的状态都设置为 BACKUP,且优先级相同
ssh
SSH 路径的权限如下:
文件 | 权限 |
.ssh | 744 |
id_rsa | 600 |
剩余 | 644 |
另外,ssh 要求属主家路径的权限为 700
免密登陆
免密登陆最简单的方式是将 .ssh 路径直接拷贝到目的电脑上。另外,root 的免密登陆首先需要保证 /etc/ssh/sshd_config
文件中打开了 PermitRootLogin yes 选项
ssh-copy-id -i ~/.ssh/id_rsa 192.168.122.64
远程执行命令
远程执行的命令的方式为:
ssh root@192.168.122.128 "ls /"
这种方式会将远程进程的 stdout, stderr, stdin 绑定到当前终端,这意味一旦当前终端退出,远程进程会自动退出,要解决这种办法,需要将远程终端的相关文件描述符进行重定向:
ssh user@host "/script/to/run < /dev/null > /tmp/mylogfile 2>&1 &"
如果需要 在远程电脑 上执行图形界面,需要设置环境变量,例如:
ssh tea@192.168.122.128 "DISPLAY=:0 mate-terminal </dev/null > /tmp/tmplog 2>&1 &"
如果这种方式仍然没法执行,则需要将登陆用户更改为远程电脑上跑 xorg 的用户
另一种问题是需要测试远程服务器文件是否存在:
ssh root@aaa test -e /opt
ssh 优化选项
####普通ssh选项,相同任务每次执行时间基本相同 (OpenSSH 5.6之前版本使用)
#ssh_options=" -o StrictHostKeyChecking=no"
ssh_options=" -o StrictHostKeyChecking=no -o PubkeyAuthentication=no "
####闪速ssh优化选项,采用ssh长连接复用技术,相同任务在10s内,第二次及以后执行时间在3s内 (OpenSSH 5.6之后版本使用)
#ssh_options=" -T -q -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -o ConnectTimeout=5 -o ControlMaster=auto -o ControlPath=$tmp_dir/.ssh_mux_%h_%p_%r -o ControlPersist=600s "
####闪速ssh优化选项,启用压缩选项,在低速网络链接环境使用,采用ssh长连接复用技术,相同任务在10s内,第二次及以后执行时间在3s内 (OpenSSH 5.6之后版本使用)
#ssh_options=" -C -tt -q -o StrictHostKeyChecking=no -o PubkeyAuthentication=no -o ConnectTimeout=5 -o ControlMaster=auto -o ControlPath=$tmp_dir/.ssh_mux_%h_%p_%r -o ControlPersist=600s"
ssh_cmd="/usr/bin/sshpass -p${remote_ssh_user_pass} /usr/bin/ssh ${ssh_options}"
转自
tc
摘抄自
模拟丢包
sudo tc qdisc add dev eth0 root netem loss 10%
模拟延迟
sudo tc qdisc add dev eth0 root netem delay 40ms
对发往 199.91.72.192:36000 的网络包产生 13% 的丢包和 40ms 的延迟
sudo tc qdisc add dev eth0 root handle 1: prio
sudo tc qdisc add dev eth0 parent 1:3 handle 30: netem loss 13% delay 40ms
sudo tc filter add dev eth0 protocol ip parent 1:0 u32 match ip dst 199.91.72.192 match ip dport 36000 0xffff flowid 1:3
删除规则:
sudo tc qdisc del dev eth0 root
linux 模拟延时和丢包
转至
这是 RHCA 中的一个 BDP 的测试,这也是公司很常用的一种延时和丢包的模拟,现在分享给大家。
我们做的应用软件,还有测试 TCP/UDP 对比,测试 BDP 对 TCP/IP 的影响时,我们都需要一些网络中的延时和丢包模拟,很多商业的软件可以做这个事,其实完美的 Linux 本身就可以使用 TC 来实现这个功能。TC 中的 Netem 可以模拟时延,丢包,重复包,乱序等功能
建议大家如果测试的话,使用 tc 当中间的路由器,来接二个网卡,然后打开路由功能来测试。
tc 的最最基本的使用
tc qdisc show # 显示
tc qdisc add dev eth0 root ----.. # 加入
tc qdisc change dev eth0 root ----.. # 修改存在的 qdisc ,记的,加入同一条后只能用 change 来修改
tc qdisc del dev eth0 root # 删除
Linux 中延时模拟
设置延时 3s :
tc qdisc add dev eth0 root netem delay 3000ms
可以在 3000ms 后面在加上一个延时,比如 ’3000ms 200ms‘表示 3000ms ± 200ms ,延时范围 2800 – 3200 之间. 结果显示如下
Linux 中丢包模拟
设置丢包 50% ,iptables 也可以模拟这个,但一下不记的命令了,下次放上来:
tc qdisc change dev eth0 root netem loss 50%
上面的设丢包,如果给后面的 50% 的丢包比率修改成 ‘50% 80%’ 时,这时和上面的延时不一样,这是指丢包比率为 50-80% 之间. 显示如下
求文件交集和差集
作用 | 方式 |
---|---|
a 交 b |
|
a 交 b |
|
a 并 b |
|
a - b |
|
a - b |
|
a - b |
|
comm 要求文件是已排序的 |
二进制补丁
二进制补丁有三种工具:
rdiff
bsdiff / bspatch
git diff / apply
ping
ping -b 可以向广播地址发送 ICMPv4 报文
ping 224.0.0.251 多播 可以向 响应 mDNS 地址 224.0.0.251 的主机发送 ICMPv4 报文