【嵌入式八股23】Linux关键指令
系统关机命令
在 Linux 系统中,有多种命令可用于实现系统关机或重启操作,以下为你详细介绍各命令及其特点:
shutdown |
该命令能够安全地将系统关机。它允许用户指定关机的时间,还可以在关机前向所有登录用户发送警告消息。例如,shutdown -h now 可立即关机,shutdown -h 20:30 则会在晚上 8 点 30 分关机。 |
halt |
本质上就是调用 shutdown -h。此命令会停止系统运行,使计算机进入停机状态。 |
reboot |
其工作过程与 halt 类似,不过它的作用是引发主机重启,让系统重新启动。 |
poweroff |
是 halt 的软链接,功能同样是停止系统运行,最终切断电源。 |
init |
作为所有进程的祖先,它的进程号始终为 1。使用 init 0 可实现关机操作,而 init 6 则用于重启系统。 |
Linux 查看文本的指令
在 Linux 中,有许多指令可用于查看文本内容,以下是一些常用指令及其功能:
cat |
用于将文件内容连续输出到标准输出,适合查看内容较少的文件。 |
tac |
与 cat 相反,它会从文件的最后一行开始倒序显示全部内容。 |
sed |
是一个强大的流编辑器,可用于对文本进行替换、删除、插入等操作,也能用于查看文本。 |
head |
只显示文件的头几行,默认显示前 10 行,可通过 -n 选项指定显示的行数。 |
tail |
只显示文件的最后几行,默认显示后 10 行,使用 -f 选项可以实时显示日志文件的更新内容。 |
more |
以分页的方式显示文件内容,按空格键翻页,按 q 键退出。 |
less |
也是分页查看文件内容的工具,它比 more 功能更强大,支持向前和向后翻页,使用起来更加灵活。 |
nl |
类似于 cat -n,在显示文件内容时会输出行号。 |
mount 命令
mount 命令用于将文件系统挂载到指定的挂载点,其基本命令格式如下:
mount [-t vfstype] [-o options] device dir
-t vfstype:指定要挂载的文件系统类型,如ext4、nfs等。-o options:用于指定挂载选项,如ro(只读)、rw(读写)等。device:要挂载的设备,如硬盘分区、U盘等。dir:挂载点,即文件系统挂载到的目录。
以下是一个挂载 NFS(网络文件系统)的示例:
mount -t nfs 192.168.0.1:/tmp /mnt/nfs
此命令将 IP 地址为 192.168.0.1 的服务器上的 /tmp 目录挂载到本地的 /mnt/nfs 目录。
dmesg 命令
dmesg 命令用于显示内核环缓冲区中的消息,这些消息包含了系统启动时的硬件检测信息、驱动程序加载信息等。你也可以通过以下命令查看系统日志文件:
cat /var/log/messages
该文件记录了系统的各种事件和错误信息。
grep 命令
grep 是一个强大的文本搜索工具,可用于在文件中查找匹配指定模式的行。
选项
-c:只输出匹配行的计数。
-C [number]:显示匹配行及其前后各 [number] 行的上下文。
-I:不区分大小写(只适用于单字符)。
-i:不区分大小写。
-h:查询多文件时不显示文件名。
-l:查询多文件时只输出包含匹配字符的文件名。
-L:列出不匹配的文件名。
-n:显示匹配行及行号。
-s:不显示不存在或无匹配文本的错误信息。
-v:显示不包含匹配文本的所有行。
-w:只匹配整个单词。
-E:使用扩展的正则表达式。
-R:递归搜寻指定目录及其子目录下的文件。
--exclude=FILE:跳过指定的文件。
正则表达式主要参数
\:忽略正则表达式中特殊字符的原有含义。
^:匹配正则表达式的开始行。
$:匹配正则表达式的结束行。
\<:从匹配正则表达式的单词开始。
\>:到匹配正则表达式的单词结束。
[]:匹配单个字符,如 [A] 表示匹配字符 A。
[-]:指定范围,如 [A-Z] 表示匹配从 A 到 Z 的任意一个大写字母。
.:匹配所有的单个字符。
*:匹配零个或多个前面的字符。
经典使用方法
# 查找所有以 d 开头的文件中包含 test 的匹配行
grep "test" d*
# 查找包含 test 或者 zephyr 的行,不区分大小写,显示行号,使用扩展正则表达式
grep -inE "test|zephyr" d*
# 查找同时包含 test 和 zephyr 的行,不区分大小写,显示行号,使用扩展正则表达式
grep -in "test" d* | grep 'zephyr'
find 命令
find 命令用于在指定目录下查找符合条件的文件和目录,其基本用法如下:
find [-path ..] [expression]
选项
-name:按照文件名查找。
-iname:按照文件名查找,忽略大小写。
-perm:按照文件权限查找。
-user:按照文件拥有者查找。
-group:按照文件所属的组查找。
-mtime -n +n:按照文件的更改时间来查找文件,-n 表示 n 天以内更改的文件,+n 表示 n 天以前更改的文件。
-type:查找某一类型的文件,文件类型有:普通文件 (f),目录 (d),字符设备文件 (c),块设备文件 (b),符号链接文件 (l),套接字文件 (s),管道文件 (p)。
-size n:查找文件长度为 n 块(一块等于 512 字节)的文件,带有 c 时表示文件长度以字节计。
-mount:不跨越文件系统进行查找。
-follow:遇到符号链接文件,就跟踪至链接所指向的文件。
-path:匹配文件路径或者文件名。
-exec:对查找到的文件执行后续命令操作。
-a:逻辑与操作。
-o:逻辑或操作。
-not:逻辑非操作。
经典使用方法
# 查找 /run 中所有的 socket 文件
find /run -type s
# 搜索 /dev 中所有包含 tty 的文件
find /dev -name "*tty*"
# 搜索 /dev 中大小大于 10 字节,名称包含 bus 的文件
find /dev -size +10c -name "*bus*"
# 或操作,搜索以 debug 开头的文件或者扩展名为 .rst 的文件
find -name 'debug*' -o -name '*.rst'
# 与操作,搜索以 debug 开头且扩展名为 .rst 的文件
find -name 'debug*' -a -name '*.rst'
# 找出文件大小大于 10000 块的文件,并复制到当前目录
find -size +10000 -exec cp {} . \;
高级使用方法
# 查询所有 mk 文件中的 date 文本
find ./build/ -name "*.mk" -print -exec grep -rwn "date" --color=auto {} \;
lsusb 命令
lsusb 是一个用于显示系统中已连接的 USB 总线信息的工具。
$ lsusb
Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 002 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub
Bus 003 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 004 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 005 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 006 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 007 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 008 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub
Bus 002 Device 003: ID 17ef:4811 Lenovo Integrated Webcam [R5U877]
Bus 008 Device 002: ID 0a5c:217f Broadcom Corp. Bluetooth Controller
Bus 008:指明设备连接到哪条总线。Device 002:表明这是连接到该总线上的第二台设备。ID:设备的 ID。Broadcom Corp. Bluetooth Controller:生产商名字和设备名。
其他用法
# 列出 USB 详细信息
$ lsusb -v
# 列出有多少 USB 设备
$ find /dev/bus
# 打印特定设备的详细信息
$ lsusb -D /dev/bus/usb/008/002
lsof 命令
lsof 用于列出当前系统打开的文件信息,它可以帮助你了解哪些进程正在使用哪些文件。
$ sudo lsof
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root cwd DIR 3,3 1024 2 /
init 1 root rtd DIR 3,3 1024 2 /
init 1 root txt REG 3,3 38432 1763452 /sbin/init
init 1 root mem REG 3,3 106114 1091620 /lib/libdl-2.6.so
init 1 root mem REG 3,3 7560696 1091614 /lib/libc-2.6.so
init 1 root mem REG 3,3 79460 1091669 /lib/libselinux.so.1
init 1 root mem REG 3,3 223280 1091668 /lib/libsepol.so.1
init 1 root mem REG 3,3 564136 1091607 /lib/ld-2.6.so
init 1 root 10u FIFO 0,15 1309 /dev/initctl
输出列说明
COMMAND |
进程的名称 | 正在打开文件的进程的名称。 |
PID |
进程标识符 | 每个进程的唯一标识符。 |
USER |
进程所有者 | 拥有该进程的用户。 |
FD |
文件描述符 | 应用程序通过文件描述符识别该文件,常见的有 cwd(当前工作目录)、txt(程序文本)、mem(内存映射文件)等。 |
TYPE |
文件类型 | 常见的文件类型有 REG(普通文件)、DIR(目录)、CHR(字符设备)、BLK(块设备)、FIFO(管道)、UNIX(UNIX 域套接字)、IPv4(IP 套接字)等。 |
DEVICE |
指定磁盘的名称 | 存储该文件的磁盘设备。 |
SIZE |
文件大小 | 文件的大小。 |
NODE |
文件 inode | 每个文件都有一个唯一的 inode 编号。 |
NAME |
文件名称 | 被打开的文件的名称。 |
参数列表
lsof filename:显示打开指定文件的所有进程。
lsof -a:表示两个参数都必须满足时才显示结果。
lsof -c string:显示 COMMAND 列中包含指定字符的进程所有打开的文件。
lsof -u username:显示所属指定用户进程打开的文件。
lsof -g gid:显示归属指定 gid 的进程情况。
lsof +d /DIR/:显示指定目录下被进程打开的文件。
lsof +D /DIR/:同上,但是会搜索目录下的所有子目录,耗时相对较长。
lsof -d FD:显示指定文件描述符的进程。
lsof -n:不将 IP 转换为 hostname,默认是不加上 -n 参数。
lsof -i:用以显示符合条件的进程情况。
lsof -i[46] [protocol][@hostname|hostaddr][:service|port]:
46 --> IPv4 or IPv6
protocol --> TCP or UDP
hostname --> Internet host name
hostaddr --> IPv4 地址
service --> /etc/service 中的 service name (可以不只一个)
port --> 端口号 (可以不只一个)
查找示例
# 显示打开指定文件的所有进程
$ lsof filename
# 例如:打开所有使用 /dev/urandom 的进程
$ lsof /dev/urandom
# 查看 22 端口现在运行的情况
$ lsof -i :22
# 查看所属 xiaxiaowen 用户进程所打开的文件类型为 txt 的文件
$ lsof -a -u xiaxiaowen -d txt
# 查找谁在使用文件系统
$ lsof /media/xiaxiaowen/机械硬盘
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
zsh 8465 xiaxiaowen cwd DIR 8,17 8192 5 /media/xiaxiaowen/机械硬盘
嵌入式八股/模拟面试拷打 文章被收录于专栏
一些八股模拟拷打Point,万一有点用呢

查看16道真题和解析