Linux Tips
Linux Tips
记录使用 Linux 过程中的一些技巧。
GUI 工具
wsl
在资源管理器中输入下面的路径,访问 wsl 所在目录
\\wsl$
wsl 在 windows 文件系统上的路径:
C:\Users\user_name\AppData\Local\Packages\CanonicalGroupLimited.Ubuntu20.04onWindows_79rhkp1fndgsc\LocalState\rootfs\
okular
# 非 KDE 桌面不建议安装
sudo apt-get install okular # 安装
sudo apt-get install kde-l10n-zhcn # 汉化
gedit
sudo apt-get install gedit-plugins # plugin
使用 ALT+CTRL+N 快捷键可在 gedit 实现如下图的分栏效果:
ubuntu update snap-store
killall snap-store
sudo snap refresh snap-store
flameshot 截图软件
sudo apt-get install flameshot
设置截图快捷键,这里设置为 F1。
安装 albert
git clone --recursive https://github.com/albertlauncher/albert.git
mkdir albert-build
cd albert-build
cmake ../albert -DCMAKE_INSTALL_PREFIX=/usr -DCMAKE_BUILD_TYPE=Debug
make
sudo make install
zeal
Zeal 国外一款面向开发者的离线文档查看工具
shell 脚本技巧
脚本开头加/bin/sh -x 或者 /bin/bash -x 脚本中每条命令的执行情况打印出来
使用 shellcheck 工具进行 shell 脚本的语法检查
shell 中别名的含义
— $0 - Name of the script
— $1 to $9 - Arguments to the script. $1 is the first argument and so on.
— $@ - All the arguments
— $# - Number of arguments
— $? - Return code of the previous command
— $$ - Process Identification number for the current script
— !! - Entire last command, including arguments. A common pattern is to execute a command only for it to fail due to missing permissions,then you can quickly execute it with sudo by doing sudo !!
— $_ - Last argument from the last command. If you are in an interactive shell, you can also quickly get this value by typing Esc followed by .
命令行工具
命令行光标移动快捷键
git
ssh -T -p 443 git@ssh.github.com # test 443 port
ssh -T git@github.com # test github connection
rlwrap
rlwrap 是一个在 Linux/Unix 系统上使用 readline 库包装 (wrap) 的实用工具,它可以为其他命令提供命令行编辑和历史记录功能。通过 rlwrap,你可以在使用像 telnet、ftp、sqlplus 或其他不支持命令行编辑和历史记录的命令行工具时,获得类似于 Bash 或其他支持 readline 的终端的功能。
rlwrap telnet example.com 80
这样,你就可以在 telnet 连接时使用箭头键进行命令行编辑、使用 Ctrl+R 进行历史搜索等功能。
更换默认的 sh
chsh -s /usr/bin/fish
chsh -s /bin/bash
update gcc
sudo apt-get update
sudo apt-get install gcc-10
sudo apt-get install g++-10
cd /usr/bin
sudo rm gcc g++
sudo ln -s gcc-10 gcc
sudo ln -s g++-10 g++
定位头文件
locate resource.h # 定位头文件在系统中的位置
解压 gz 文件
gzip -dk file.gz
sysstat 软件包
-
iostat 监控磁盘状态 -x 参数监控 io 输入是否过大。
-
vmstat 虚存数据
-
mpstat cpu监控
-
sar 监控网络,磁盘,内存等,配置(man sadc)可以读取系统的历史数据,对于分析系统的状态非常有帮助
-
watch -d free 观察内存各项数据的变化情况
-
cat /etc/os-release 查看发行版
《性能之巅》笔记
- dmesg -T | tail 包括 OOM 事件的内核错误
- vmstat -SM 1 系统级统计:运行队列长度、交换、CPU 总体使用情况
- mpstat -P ALL 1 CPU 平衡情况:单个 CPU 很繁忙,意味着线程扩展性糟糕
- pidstat 1 每个进程的CPU使用情况:识别意外的 CPU消费者,以及每个进程的用户/系统 CPU 时间
- iostat -sxz 1 磁盘 I/O 统计:OPS 和吞吐量、平均等待时间、忙碌百分比
- sar -n DEV 1 网络设备 I/O:数据包和吞吐量
- sar -n TCP, ETCP 1 TCP 统计:连接率、重传
其他命令行工具
ifstat 网络接口流量监控
dstat 整合 vmstat, iostat和ifstat, 界面显示更友好, 更能更强大
top 查看系统当前资源
- 1 查看 CPU 核心数量
- shift + u 可查看指定用户的资源情况
- shift + p CPU 消耗动态排序
- shift + m 以内存使用多少来排序
atop 进程性能监控
iperf 网络测试工具, 可以测带宽 iperf 工具需要在客户端和服务端同时进行安装
smem 进程内存显示
iotop 类似于 top, 不过显示的是磁盘 io 性能, 对于查看主要是哪些进程在使用 io 很有帮助
glances与top和htop比较显示的信息更全,包括 io, network, ip, 公网ip等信息
pmap(process map) <进程号> 显示进程的映射情况
ps
-
ps axj 能够显示进程的会话状态
-
ps axf (pid tty stat time command)
-
ps axm(more)以详细信息展示
-
ps ax -L 以linux方式展示 多了一列LWP(轻量级线程号)
-
ps aux | grep -E [3]9788 打印给定进程,避免打印本命令
unlink 删除软链接
ln -s 源文件 快捷方式 创建软链接
ln -snf 更新软链接
find -exec (执行的命令) {}\ 对给定文件执行命令
tar cvf - file | ssh user@example.com "tar xv - c Document/" 对file中的内容进行归档,并将其输出到stdout 后 然后提取到远程系统中的document目录中
ldd 打印程序依赖的共享库
nmap -sT 判断对方打开的端口号
wget -c 断点续传 -b 后台传输 -P指定下载位置
tags ctags 对头文件目录进行索引
tail - f 可以实时查看文件输出
-
但是如果这期间文件被移动或删除, 即使日志文件重新生成tail - f的输出不会恢复
-
使用tail -F 则可以避免这个问题, 输出不会停止
-
因为 -f 监测的是fd, 而 -F 监测的是文件名
img2pdf + ocrmypdf 命令行下处理 PDF 神奇组合,无损生成 PDF 文件, OCR 在扫描文件上加一层文本使其可搜索, 两者可管道组合很灵活
pdfunite 1.pdf 2.pdf 3.pdf result.pdf 合并多个pdf
nc -zv 192.168.0.1 10 80 22 21 检查远程主机192.168.0.1上是否打开了80 22和21端口
-
-z 设置nc只是扫描侦听守护进程,实际上不向他们发送任何数据
-
-v 启用详细模式
-
nc -zv 192.168.0.1 10-80可以指定端口范围10-80
ls | xargs -i echo {} 显示当前文件夹下的所有文件, xargs -i参数,会把ls结果的每一条结果逐个放到{}中
ss (Utility to investigate sockets)
-
-tna 显示所有的正在监听的 TCP 链接
-
-tlp 查看监听端口的名称
-
-h, --help 帮助
-
-V, --version 显示版本号
-
-t, --tcp 显示 TCP 协议的 sockets
-
-u, --udp 显示 UDP 协议的 sockets
-
-x, --unix 显示 unix domain sockets,与 -f 选项相同
-
-n, --numeric 不解析服务的名称,如 "22" 端口不会显示成 "ssh"
-
-l, --listening 只显示处于监听状态的端口
-
-p, --processes 显示监听端口的进程(Ubuntu 上需要 sudo)
-
-a, --all 对 TCP 协议来说,既包含监听的端口,也包含建立的连接
-
-r, --resolve 把 IP 解释为域名,把端口号解释为协议名称
ethtool eth0 查看给定网卡带宽
getfacl filename 查看文件的具体权限
关于 OOM
Linux 中 malloc 返回非空指针,并不一定意味着指向的内存就是可用的,Linux 下允许程序申请比系统可用内存更多的内存,这个特性叫 Overcommit 这样做是出于优化系统考虑,因为不是所有的程序申请了内存就立刻使用的,当你使用的时候说不定系统已经回收了一些资源了。不幸的是,当你用到这个Overcommit 给你的内存的时候,系统还没有资源的话,OOM killer就跳出来了。
# 使用 dmesg 命令
dmesg
#[817032.308828] Out of memory: Kill process xxxx (php-fpm) score xxxx or sacrifice child
#[817032.324742] Killed process xxx (php-fpm) total-vm:xxxxx kB, anon-rss:xxxxx kB, file-rss:xxxx kB, shmem-rss:xxxx kB