本博文旨在记录Linux使用过程中常遇到的一些问题和解决方案。 --- 笔者
1. 查看端口占用
当你需要使用某一端口时发现程序因为端口被占用而无法正常运行,你需要知道端口被什么程序占用,运行查看:
netstat -anpe | grep 端口
2. 查看命令行的运行参数
平时实验需要运行很多脚本程序,而且不同的脚本程序使用的脚本参数也不一样,有的很长有的很短,如果脚本有很多输出的话,脚本程序的设置很快就会被挤出程序以外,这时候你如果忘了正在运行的脚本使用的是什么设置怎么办?下面就教大家查看运行的程序及其参量:
- 使用top指令
top -u<username> -c
默认情况下top
指令只显示程序名称(不包括参数),添加-c
参数可以输出查看程序的参数。参数-u<username>
仅用于基于用户名过滤输出列表,这样我们就可以在有限的屏幕空间上查看指定用户启动的程序。
- 使用 ps指令
ps -f -u<username> | grep <program>
指令ps
用于查看当前运行的进程,默认情况下以简易模式输出当前机器上所有运行中的程序,一般而言运行的程序(包括系统程序和各用户运行的程序)数量比较大,不利于快速查看,我们可以通过设置-u
参数来根据用户过滤出指定用户启动的活动程序,还能通过grep
指令进一步实现按关键字过滤。参数-f
可强制ps
指令打印出程序参数。
- 查看/proc/<pid>/cmdline 信息
cat /proc/<pid>/cmdline
Linux系统中/proc
目录是一个很特殊的目录,它保存着系统运行时信息。
/proc is very special in that it is also a virtual filesystem. It's sometimes referred to as a process information pseudo-file system. It doesn't contain 'real' files but runtime system information (e.g. system memory, devices mounted, hardware configuration, etc). For this reason it can be regarded as a control and information centre for the kernel. In fact, quite a lot of system utilities are simply calls to files in this directory. For example, 'lsmod' is the same as 'cat /proc/modules' while 'lspci' is a synonym for 'cat /proc/pci'. By altering files located in this directory you can even read/change kernel parameters (sysctl) while the system is running. Each of the numbered directories corresponds to an actual process ID.
3. 查看CPU占用前10的进程
使用top
指令查看系统运行进程的时候,默认打印所有用户的活动进程,如果指定用户或组别,那么也只能显示指定用户和组别的活动进程,使用top
指令难以实现本节所要实现的目的。下面我们一步步介绍怎么才能实现查看CPU占用前10的进程:
- 首先获取活动进程信息
## 通过`ps`指令活动活动进程信息
ps -aux
- 获取指定信息
上一步中指令会打印所有用户的活动进程信息,包含内容很丰富,实际上我们查看前10进程的时候并不需要那么多详细的信息,而且信息太详细显示起来也比较麻烦,所以我们要有选择地显示感兴趣的信息:
## 仅显示nice值,用户,进程id,cpu用量,内存用量,cpu时间,进程启动至今总时长 和 进程名称
ps -au -o ni,user,pid,pcpu,pmem,cputime,etime,comm
- 获取指定用户的进程信息
步骤2中的方法获得的信息虽然少了许多,但打印的进程单还是很长,其中有许多是root运行的系统启动的进程。我们在查看进程的时候更多的是关心用户启动的进程,这时候就要对进程按用户进行过滤:
- 按用户过滤
ps -U user1,user2 -u user1,user2 -o ni,user,pid,pcpu,pmem,cputime,etime,comm
- 进程按照CPU用量排序并取前十
这里还有些额外的处理,首先步骤3输出中包含标题,需要去除标题信息:
- 去除标题,得到实际统计数据
ps -U user1,user2 -u user1,user2 -o ni,user,pid,pcpu,pmem,cputime,etime,comm | grep -v PID
- 按CPU用量逆向排序
ps -U user1,user2 -u user1,user2 -o ni,user,pid,pcpu,pmem,cputime,etime,comm | grep -v PID | sort -rn -k +4
- 用HEAD指令取前十
ps -U user1,user2 -u user1,user2 -o ni,user,pid,pcpu,pmem,cputime,etime,comm | grep -v PID | sort -rn -k +4 | head -10
head
指令默认返回前十行数据,可通过设置要返回的行数返回指定行的数据,如:返回前20行 head -20
最终指令如是:
ps -U user1,user2 -u user1,user2 -o ni,user,pid,pcpu,pmem,cputime,etime,comm | grep -v PID | sort -rn -k +4 | head -10
4. 查看内存用量前10的进程
方法与“查看CPU占用前10的进程”类似,如下:
ps -U user1,user2 -u user1,user2 -o ni,user,pid,pcpu,pmem,cputime,etime,comm | grep -v PID | sort -rn -k +5 | head -10
5. Linuxbrew使用brew安装的curl
Linuxbrew使用brew命令从网络获取信息时,默认使用/usr/bin/curl
,而不管你是不是从brew安装了curl或者手动安装了curl,即便他们在PATH中的位置在系统默认curl前。这是因为brew代码中设置了PATH过滤:
# test-bot does environment filtering itself
if [[ -z "$HOMEBREW_NO_ENV_FILTERING" && "$1" != "test-bot" ]]
then
PATH="/usr/bin:/bin:/usr/sbin:/sbin"
FILTERED_ENV=()
所以我们在使用brew前设置HOMEBREW_NO_ENV_FILTERING
环境变量即可。例如:
HOMEBREW_FORCE_BREWED_CURL=1 HOMEBREW_NO_ENV_FILTERING=1 brew install curl
HOMEBREW_FORCE_BREWED_CURL=1 brew install hello
6. dpkg 批量删除
dpkg -l | grep libreoffice | awk '{print $2}' | xargs sudo dpkg -P
7. 查看拥有sudo权限的用户
默认情况下系统的sudo相关设置在,/etc/sudoers
文件中定义,我们习惯性以为看sudo用户组的成员就能知道谁有高级权限时片面的理解,具体哪些用户或组有高级权限要看sudoer文件的配置
8. 查看显卡信息
## 查看显卡安装情况
## 列举已安装显卡
lspci | grep -i vga
## 查看显卡详情
## 02:00.0 VGA compatible controller: nVidia Corporation GT215 [GeForce GT 240] (rev a2)
lspci -v -s 02:00.0
## NVIDIA 显卡可使用nvidia-smi查看
nvidia-smi
我们还可以用lshw
指令来查看显示硬件信息,命令使用方法如下:
lshw参数:
-help 查看帮助
-version 打印版本
-X GUI显示,要装lshw-gtk 或者lshw-gui
输出的格式
-html 以HTML格式输出
-xml 以XML 格式输出
-short 显示设备列表,输出包括设备路径(path)、类别(class)以及简单描述
-businfo 输出包括总线信息、SCSI、USB、IDE、PCI地址等信息
选项:
-class CLASS 显示指定类别的设备
-C CLASS 同上
-c CLASS 同上
-disable TEST 不检测信息 像 pci 、isapnp、 cpuid等等
-enable TEST 与上面相反,启用检测
-quiet 直接输出结果,不显示检测过程
-sanitize 无害输出 (会移除像硬件序列号等一些敏感信息)
-numeric 显示硬件id (PCI、USB等)
查看显示设备信息可使用 lshw -numeric -c video
或者 lshw -numeric -c display
,下面是一个输出信息示例
WARNING: you should run this program as super-user.
*-display
description: VGA compatible controller
product: GM200 [GeForce GTX TITAN X] [10DE:17C2]
vendor: NVIDIA Corporation [10DE]
physical id: 0
bus info: pci@0000:03:00.0
version: a1
width: 64 bits
clock: 33MHz
capabilities: vga_controller bus_master cap_list rom
configuration: driver=nvidia latency=0
resources: irq:73 memory:fa000000-faffffff memory:e0000000-efffffff memory:f0000000-f1ffffff ioport:e000(size=128) memory:fb000000-fb07ffff
WARNING: output may be incomplete or inaccurate, you should run this program as super-user.
其中configuration
参数部分表明当前设备使用的驱动类型(示例设备使用Nvidia驱动),可以使用lshw -c video | grep configuration
直接获取。
modinfo nvidia
查看驱动的详细信息,如下:
filename: /lib/modules/4.4.0-137-generic/updates/dkms/nvidia.ko
alias: char-major-195-*
version: 390.87
supported: external
license: NVIDIA
srcversion: 9680830EEE0BAB392576E99
alias: pci:v000010DEd00000E00sv*sd*bc04sc80i00*
alias: pci:v000010DEd*sv*sd*bc03sc02i00*
alias: pci:v000010DEd*sv*sd*bc03sc00i00*
depends: ipmi_msghandler
retpoline: Y
vermagic: 4.4.0-137-generic SMP mod_unload modversions retpoline
parm: NVreg_Mobile:int
parm: NVreg_ResmanDebugLevel:int
parm: NVreg_RmLogonRC:int
parm: NVreg_ModifyDeviceFiles:int
parm: NVreg_DeviceFileUID:int
parm: NVreg_DeviceFileGID:int
parm: NVreg_DeviceFileMode:int
parm: NVreg_UpdateMemoryTypes:int
parm: NVreg_InitializeSystemMemoryAllocations:int
parm: NVreg_UsePageAttributeTable:int
parm: NVreg_MapRegistersEarly:int
parm: NVreg_RegisterForACPIEvents:int
parm: NVreg_CheckPCIConfigSpace:int
parm: NVreg_EnablePCIeGen3:int
parm: NVreg_EnableMSI:int
parm: NVreg_TCEBypassMode:int
parm: NVreg_UseThreadedInterrupts:int
parm: NVreg_EnableStreamMemOPs:int
parm: NVreg_EnableBacklightHandler:int
parm: NVreg_EnableUserNUMAManagement:int
parm: NVreg_EnableIBMNPURelaxedOrderingMode:int
parm: NVreg_MemoryPoolSize:int
parm: NVreg_IgnoreMMIOCheck:int
parm: NVreg_RegistryDwords:charp
parm: NVreg_RegistryDwordsPerDevice:charp
parm: NVreg_RmMsg:charp
parm: NVreg_AssignGpus:charp
Ref:
9. 删除添加的PPA源
## e.g. remove added graphics-drivers/ppa source
add-apt-repository ppa:graphics-drivers/ppa
10. 修改用户UID和GID
# change user foo to new uid=1066
usermod -u 1066 foo
# change group foo to new gid=2066
groupmod -g 2066 foo
11. 强制开机启动RPC bind服务
systemctl add-wants multi-user rpcbind.service