【Debian参考手册】第 9 章 系统技巧

目录

9.1. 控制台技巧
9.1.1. 清晰的记录 shell 活动
9.1.2. screen 程序
9.1.3. 在目录间游走
9.1.4. Readline 封装
9.1.5. 扫描源代码树
9.2. 定制 vim
9.2.1. 用内部特性定制 vim
9.2.2. 用外部软件包定制 vim
9.3. 数据记录和展示
9.3.1. 日志后台守护进程(daemon)
9.3.2. 日志分析
9.3.3. 定制文本数据的显示
9.3.4. 定制时间和日期的显示
9.3.5. shell 中 echo 的颜色
9.3.6. 有颜色输出的命令
9.3.7. 记录编辑器复杂的重复操作动作
9.3.8. 记录 X 应用程序的图像
9.3.9. 记录配置文件的变更
9.4. 监控、控制和启动程序活动
9.4.1. 进程耗时
9.4.2. 调度优先级
9.4.3. ps 命令
9.4.4. top 命令
9.4.5. 列出被一个进程打开的文件
9.4.6. 跟踪程序活动
9.4.7. 识别使用文件和套接字的进程
9.4.8. 使用固定间隔重复一个命令
9.4.9. 使用文件循环来重复一个命令
9.4.10. 从 GUI 启动一个程序
9.4.11. 自定义被启动的程序
9.4.12. 杀死一个进程
9.4.13. 单次任务时间安排
9.4.14. 定时任务安排
9.4.15. Alt-SysRq 键
9.5. 系统维护技巧
9.5.1. 谁在系统里?
9.5.2. 警告所有人
9.5.3. 硬件识别
9.5.4. 硬件配置
9.5.5. 系统时间和硬件时间
9.5.6. 终端配置
9.5.7. 声音基础设施
9.5.8. 关闭屏幕保护
9.5.9. 关闭蜂鸣声
9.5.10. 内存使用
9.5.11. 系统安全性和完整性检查
9.6. 数据存储技巧
9.6.1. 硬盘空间使用情况
9.6.2. 硬盘分区配置
9.6.3. 使用 UUID 访问分区
9.6.4. LVM2
9.6.5. 文件系统配置
9.6.6. 文件系统创建和完整性检查
9.6.7. 通过挂载选项优化文件系统
9.6.8. 通过超级块(superblock)优化文件系统
9.6.9. 硬盘优化
9.6.10. 固态硬盘优化
9.6.11. 使用 SMART 预测硬盘故障
9.6.12. 通过 $TMPDIR 指定临时存储目录
9.6.13. 通过 LVM 扩展可用存储空间
9.6.14. 通过挂载另一个分区来扩展可用存储空间
9.6.15. 通过 “mount --bind” 挂载另一个目录来扩展可用存储空间
9.6.16. 通过 overlay 挂载(overlay-mounting)另一个目录来扩展可用存储空间
9.6.17. 使用符号链接扩展可用存储空间
9.7. 磁盘映像
9.7.1. 制作磁盘映像文件
9.7.2. 直接写入硬盘
9.7.3. 挂载磁盘映像文件
9.7.4. 清理磁盘映像文件
9.7.5. 制作空的磁盘映像文件
9.7.6. 制作 ISO9660 镜像文件
9.7.7. 直接写入文件到 CD/DVD-R/RW
9.7.8. 挂载 ISO9660 镜像文件
9.8. 二进制数据
9.8.1. 查看和编辑二进制数据
9.8.2. 不挂载磁盘操作文件
9.8.3. 数据冗余
9.8.4. 数据文件恢复和诊断分析
9.8.5. 把大文件分成多个小文件
9.8.6. 清空文件内容
9.8.7. 样子文件
9.8.8. 擦除整块硬盘
9.8.9. 擦除硬盘上的未使用的区域
9.8.10. 恢复已经删除但仍然被打开的文件
9.8.11. 查找所有硬链接
9.8.12. 不可见磁盘空间消耗
9.9. 数据加密提示
9.9.1. 使用 dm-crypt/LUKS 加密移动磁盘
9.9.2. 使用dm-crypt/LUKS挂载加密的磁盘
9.10. 内核
9.10.1. 内核参数
9.10.2. 内核头文件
9.10.3. 编译内核和相关模块
9.10.4. 编译内核源代码:Debian 内核团队推荐
9.10.5. 硬件驱动和固件
9.11. 虚拟化系统
9.11.1. 虚拟化和模拟器工具
9.11.2. 虚拟化工作流
9.11.3. 挂载虚拟磁盘映像文件
9.11.4. Chroot 系统
9.11.5. 多桌面系统

这里,描述配置和管理系统的基本技巧,大部分在控制台操作。

9.1. 控制台技巧

有一些工具程序来帮助你的控制台活动。

表 9.1. 支持控制台活动的程序列表

软件包 流行度 大小 说明
mc V:57, I:230 1508 参见 第 1.3 节 “Midnight Commander (MC)”
bsdutils V:646, I:999 419 script 命令来记录终端会话的原始输入输出
screen V:102, I:268 1019 VT100/ANSI 终端模拟器混合复用的终端
tmux V:38, I:141 1045 终端复用的备选方案(使用 “Control-B”代替)
fzf V:3, I:9 2442 模糊的文本查找器
fzy V:0, I:0 54 模糊的文本查找器
rlwrap V:1, I:19 297 具备 readline 特征的命令行封装
ledit V:0, I:14 315 具备 readline 特征的命令行封装
rlfe V:0, I:0 49 具备 readline 特征的命令行封装
ripgrep V:3, I:12 4298 在源代码树中快速递归搜索字符串,并自动过滤

9.1.1. 清晰的记录 shell 活动

简单地使用 script(1) (参见 第 1.4.9 节 “记录 shell 活动”)记录 shell 活动会产生一个有控制字符的文件。这些控制字符可以按下面的方式,使用 col(1) 去掉。

$ script
Script started, file is typescript

做些操作……按 Ctrl-D 退出 script.

$ col -bx < typescript > cleanedfile
$ vim cleanedfile

有替代的方式来记录 shell 活动:

  • 使用 tee (在 initramfs 的启动过程中可用):

    $ sh -i 2>&1 | tee typescript
  • 使用 gnome-terminal 增加行缓冲,用滚动条查看。

  • 使用 screen 和 "^A H" (参见 第 9.1.2 节 “screen 程序”)来进行控制台记录。

  • 使用 vim 输入 ":terminal" 进入终端模式。使用 "Ctrl-W N" 从终端模式退出到普通模式。使用 ":w typescript" 将缓存写到一个文件。

  • 使用 emacs 和 "M-x shell", "M-x eshell", 或 "M-x term" 来进入记录控制台。使用 "C-x C-w" 将缓存写到文件。

9.1.2. screen 程序

screen(1) 不但允许一个终端窗口运行多个进程,还允许远程 shell 进程支持中断的连接.这里是一个典型的 screen(1) 使用场景.

  1. 登录到一个远程机器。

  2. 在单个控制台上启动 screen

  3. 使用 ^A c ("Control-A" 接着 "c")在 screen 中创建的窗口执行多个程序.

  4. ^A n ("Control-A" 接着"n")来在多个 screen 窗口间转换.

  5. 突然,你需要离开你的终端,但你不想丢掉正在做的工作,而这些工作需要连接来保持。

  6. 你可以通过任何方式分离 screen 会话。

    • 残忍地拔掉你的网络连接

    • 输入 ^A d ("Control-A" 接着 "d") 并手工从远程连接退出登录

    • 输入 ^A DD ("Control-A" 接着 "DD") 分离 screen 并退出登录

  7. 你重新登录到同一个远处主机(即使从不同的终端)。

  8. 使用 "screen -r" 启动 screen.

  9. screen 魔术般的重新附上先前所有的 screen 窗口和所有在活动运行的程序.

提示

对于拨号或者按包计费的网络连接,你可以通过 screen 节省连接费用,应为你可以在断开连接时让一个进程继续运行,当你稍后再次连接时重新附上它。

screen 会话里,除了命令按键外的所有键盘输入都会被发送到当前窗口。 screen 所有命令按键是通过 ^A ("Control-A") 加单个键[加任何参数] 来输入.这里有一些重要的命令按键需要记住。

表 9.2. screen 键绑定列表

键绑定功能 说明
^A ? 显示帮助屏幕(显示键绑定)
^A c 创建一个新的窗口并切换到该窗口
^A n 到下一个窗口
^A p 到前一个窗口
^A 0 到 0 号窗口
^A 1 到 1 号窗口
^A w 显示窗口列表
^A a 作为键盘输入发送 Ctrl-A 到当前窗口
^A h 把当前窗口的硬拷贝写到一个文件
^A H 开始/结束 当前窗口到文件的记录
^A ^X 锁定终端(密码保护)
^A d 从终端分离 screen 会话
^A DD 分离 screen 会话并退出登录

细节参见 screen(1).

参见 tmux(1) ,了解替代命令的功能。

9.1.3. 在目录间游走

在 第 1.4.2 节 “定制 bash”, 2 个技巧允许快速在目录间游走,在 $CDPATHmc 描述。

如果你使用模糊文本过滤程序,你能够不输入精准路径。对于fzf 软件包,在 ~/.bashrc 里面包括下列内容。

FZF_KEYBINDINGS_PATH=/usr/share/doc/fzf/examples/key-bindings.bash
if [ -f $FZF_KEYBINDINGS_PATH ]; then
  . $FZF_KEYBINDINGS_PATH
fi
FZF_COMPLETION_PATH=/usr/share/doc/fzf/examples/completion.bash
if [ -f $FZF_COMPLETION_PATH ]; then
  . $FZF_COMPLETION_PATH
fi

例如:

  • 你能够最小化的操作跳入非常深的子目录。你首先输入 "cd **" 后按 Tab。然后你将被提示候选路径。输入部分路径字符串,比如 s/d/b foo,将会缩窄候选路径。通过有光标和回车键的 cd,你选择将要使用的路径。

  • 你可以用最小化的操作,从命令历史里面选择一个命令。在命令行提示符下按 Ctrl-R 。然后你将被提示候选的命令。输入部分命令字符串,比如 vim d,将会缩窄候选项。使用光标和回车键选择将要使用的命令。

9.1.4. Readline 封装

一些命令,比如 /usr/bin/dash,它缺少命令行历史编辑能力,但在 rlwrap 或它的等价物下运行就能够透明的增加这样的功能。

 $ rlwrap dash -i

这提供一个便利平台来测试 dash 的细微之处,使用类似 bash 的友好环境。

9.1.5. 扫描源代码树

ripgrep 软件包中的 rg(1) 命令,在扫描源代码树的典型场景中,提供了一个比 grep(1) 命令更快速的替代。它充分利用了现代多核 CPU,并自动使用适当的过滤器来忽略一些文件。

9.2. 定制 vim

在你通过 第 1.4.8 节 “使用 vim” 学习基本的vim(1) 后,请阅读 Bram Moolenaar 的"Seven habits of effective text editing (2000)" 来理解 vim 应当怎样被使用。

小心

没有非常好的理由,请不要尝试改变默认的键绑定。

9.2.1. 用内部特性定制 vim

vim 的行为能够被显著的改变,通过 Ex-模式 的命令,启用它的内部特性,比如 "set ..." 来设置 vim 选项。

这些 Ex-模式 的命令,能够在用户的 vimrc 文件里面包括,传统的 "~/.vimrc" 或 git 友好的 "~/.vim/vimrc"。这里有一个非常简单的例。[2]

colorscheme murphy             " from /usr/share/vim/vim??/colors/*.vim
filetype plugin indent on      " filetype aware behavior
syntax enable                  " Syntax highlight
"set spelllang=en_us            " Spell check language as en_us
"set spell                      " Enable spell check
set autoindent                 " Copy indent from current line
set smartindent                " More than autoindent (Drop/Pop after {/})
set nosmarttab                 " -key always inserts blanks
set backspace=indent,eol,start " Back space through everything
set laststatus=2               " Always show status line
set statusline=%<%f%m%r%h%w%=%y[U+%04B]%2l/%2L=%P,%2c%V

9.2.2. 用外部软件包定制 vim

通过简单定制,即安装 vim-scripts 软件包,并附加下面的内容到用户的 vimrc 文件,能够启用 secure-modelines 和传统的 IDE。

packadd! secure-modelines
packadd! winmanager
let mapleader = ' '
" Toggle paste mode with p
set pastetoggle=p
" IDE-like UI for files and buffers with w
nnoremap w         :WMToggle
" Use safer keys  for moving to another window
nnoremap          h
nnoremap          j
nnoremap          k
nnoremap          l

为了使上面的按键绑定正确地运行,终端程序需要配置:Backspace-键产生 "ASCII DEL"、Delete-键产生 "Escape sequence"。

新的原生 Vim 软件包系统同 "git" 和 "git submodule" 顺利的工作。一个这样的配置例子能够在 我的 git 仓库: dot-vim 找到。本质上是这样做的:

  • 通过使用"git"和"git submodule",最新的扩展软件包,比如说"name",会被放到 ~/.vim/pack/*/opt/name 和类似的地方。

  • 通过增加 :packadd! name 行到用户的 vimrc 文件,这些软件包被放到 runtimepath

  • Vim 在它的初始化时加载这些软件包到 runtimepath

  • 在它初始化的最后,安装文档的标签被更新,使用 "helptags ALL"。

更多信息,请使用 "vim --startuptime vimstart.log" 启动 vim 来检查实际的执行顺序和每一个步骤消耗的时间。

下面能够发现有趣的外部插件软件包:

  • Vim - 无所不在的文本编辑器 -- Vim 和 vim 脚本的官方上游站点

  • VimAwsome -- Vim 插件列表

  • vim-scripts -- Debian 软件包:一个 vim 脚本的收集

是相当迷惑的看到这么多的方式[3] 来管理和加载这些外部的软件包到 vim。检查原始的信息是最好的方法。

表 9.3. vim 的初始化信息

按键 信息
:help package 解释 vim 软件包机制
:help runtimepath 解释 runtimepath 机制
:version 内部状态,包括 vimrc 文件的候选
:echo $VIM 环境变量 "$VIM" 用来定位 vimrc 文件的路径
:set runtimepath? 列出用来搜索所有运行时支持文件的目录
:echo $VIMRUNTIME 环境变量 "$VIMRUNTIME" 用来定位大量系统提供的运行时支持文件

9.3. 数据记录和展示

9.3.1. 日志后台守护进程(daemon)

许多传统的程序在"/var/log/" 目录下用文本文件格式记录它们的活动.

在一个产生很多日志文件的系统上,用 logrotate(8)来简化日志文件的管理。

许多新的程序使用 systemd-journald(8) 日志服务的二进制文件格式来记录它们的活动,在"/var/log/journal" 目录下。

你能够从 shell 脚本记录数据到 systemd-journald(8) 日志,使用 systemd-cat(1) 命令。

参见 第 3.4 节 “系统消息” 和 第 3.3 节 “内核消息”.

9.3.2. 日志分析

这里是主要的日志分析软件 ("~Gsecurity::log-analyzer" 在 aptitude(8) 中).

表 9.4. 系统日志分析软件列表

软件包 流行度 大小 说明
logwatch V:14, I:17 2276 用 Perl 写的日志分析软件,有好的输出
fail2ban V:109, I:122 2091 禁用造成多个认证错误的 IP
analog V:3, I:103 3584 web 服务器日志分析
awstats V:8, I:13 6910 强大和特性全面的 web 服务器日志分析
sarg V:2, I:2 843 生成 squid 分析报告
pflogsumm V:2, I:4 111 Postfix 日志条目概要
syslog-summary V:0, I:1 30 总结 syslog 日志文件内容
fwlogwatch V:0, I:0 478 防火墙日志分析软件
squidview V:0, I:1 189 监控和分析 squid access.log 文件
swatch V:0, I:0 101 有正则表达式、高亮和曲线的日志文件查看器
crm114 V:0, I:0 1119 Controllable Regex Mutilator 和垃圾邮件过滤 (CRM114)
icmpinfo V:0, I:0 44 解释 ICMP 信息

注意

CRM114 提供语言架构来写模糊 过滤器,使用了 TRE 正则表达式库 。它主要在垃圾邮件过滤器中使用,但也能够用于日志分析。

9.3.3. 定制文本数据的显示

尽管例如 more(1) 和 less(1) 这样的分页程序(参见 第 1.4.5 节 “分页程序”)和用于高亮和格式的自定义工具(参见 第 11.1.8 节 “高亮并格式化纯文本数据”)可以漂亮地显示文本数据,但通用的编辑器 (参见 第 1.4.6 节 “文本编辑器”)是用途最广的,且可定制性最高。

提示

对于 vim(1) 和它的分页模式别名 view(1),“:set hls” 可以启用高亮搜索。

9.3.4. 定制时间和日期的显示

ls -l” 命令默认的时间和日期显示格式取决于语言环境(相关的值参见 第 1.2.6 节 “时间戳”)。“$LANG” 变量将被首先考虑,但它会被导出的 “$LC_TIME” 或 "$LC_ALL"环境变量覆盖。

每个语言环境实际的默认显示格式取决于所使用的 C 标准库的版本(libc6 软件包),也就是说,不同的 Debian 发行版有不同的默认情况。对于 iso-formates,参见 ISO 8601。

如果你真的想自定义超出语言环境的时间和日期显示格式,你应该通过 “--time-style” 参数或 “$TIME_STYLE” 的值来设置时间样式值(参见ls(1)、date(1)、“info coreutils 'ls invocation'”)。

表 9.5. 使用 时间样式值 的"ls -l" 命令的时间和日期的显示例子

时间样式值 语言环境 时间和日期显示
iso 任何值 01-19 00:15
long-iso 任何值 2009-01-19 00:15
full-iso 任何值 2009-01-19 00:15:16.000000000 +0900
语言环境 C Jan 19 00:15
语言环境 en_US.UTF-8 Jan 19 00:15
语言环境 es_ES.UTF-8 ene 19 00:15
+%d.%m.%y %H:%M 任何值 19.01.09 00:15
+%d.%b.%y %H:%M Cen_US.UTF-8 19.Jan.09 00:15
+%d.%b.%y %H:%M es_ES.UTF-8 19.ene.09 00:15

提示

你可以使用命令别名以避免在命令行中输入长的选项,(参见 第 1.5.9 节 “命令别名”):

alias ls='ls --time-style=+%d.%m.%y %H:%M'

9.3.5. shell 中 echo 的颜色

大部分现代终端的 shell 中 echo 能够使用 ANSI 转义字符来显示颜色(参见 “/usr/share/doc/xterm/ctlseqs.txt.gz”)。

尝试下列例子

$ RED=$(printf "\x1b[31m")
$ NORMAL=$(printf "\x1b[0m")
$ REVERSE=$(printf "\x1b[7m")
$ echo "${RED}RED-TEXT${NORMAL} ${REVERSE}REVERSE-TEXT${NORMAL}"

9.3.6. 有颜色输出的命令

在交互式的环境下,命令的输出带颜色,能够给检查命令的输出带来便利。 我在我的"~/.bashrc"里加入了下面内容.

if [ "$TERM" != "dumb" ]; then
    eval "`dircolors -b`"
    alias ls='ls --color=always'
    alias ll='ls --color=always -l'
    alias la='ls --color=always -A'
    alias less='less -R'
    alias ls='ls --color=always'
    alias grep='grep --color=always'
    alias egrep='egrep --color=always'
    alias fgrep='fgrep --color=always'
    alias zgrep='zgrep --color=always'
else
    alias ll='ls -l'
    alias la='ls -A'
fi

在交互式命令中,使用别名来限制颜色的影响范围。导出环境变量 "export GREP_OPTIONS='--color=auto'" 也有好处,这样能够让 less(1) 之类的页面程序看到颜色。当使用管道到其它命令时,你想去掉颜色,上面列子 "~/.bashrc" 中的内容,可以使用 "--color=auto" 代替.

提示

在交互式的环境中,通过"TERM=dumb bash"调用 shell ,你能够关闭这些颜色别名。

9.3.7. 记录编辑器复杂的重复操作动作

你能够记录编辑器复杂的重复操作动作。

对于 Vim,请按下面操作。

  • "qa": 开始记录输入字符到有名字的寄存器 "a".

  • … 编辑器操作

  • "q": 结束记录输入的字符。

  • "@a":执行寄存器 "a 的内容".

对于 Emacs, 请按下面操作。

  • "C-x (": 开始定义一个键盘宏.

  • … 编辑器操作

  • "C-x )":结束定义一个键盘宏.

  • "C-x e": 执行一个键盘宏.

9.3.8. 记录 X 应用程序的图像

有少量方法可以记录 X 应用程序的图像,包括 xterm 显示。

表 9.6. 图形图像处理工具列表

软件包 流行度 大小 屏幕 命令
gnome-screenshot V:29, I:281 1134 Wayland GNOME 下的截屏程序
flameshot V:7, I:13 2590 Wayland 强大的截屏程序
gimp V:61, I:300 19827 Wayland + X GUI 菜单中的截屏
x11-apps V:29, I:461 2437 X xwd(1)
imagemagick I:353 221 X import(1)
scrot V:7, I:74 126 X scrot(1)

9.3.9. 记录配置文件的变更

有特定的工具可以通过 DVCS 的帮助来记录配置文件的变更和在 Btrfs 上制作系统快照。

表 9.7. 记录配置历史的软件包列表

软件包 流行度 大小 说明
etckeeper V:27, I:31 176 使用 Git(默认)、Mercurial 或 Bazaar(新)来保存配置文件和它们的元数据
timeshift V:3, I:5 3142 使用 rsync 或 BTRFS 快照的系统恢复工具
snapper V:2, I:3 2170 Linux 文件系统快照管理工具

你也可以考虑本地脚本 第 10.2.3 节 “个人备份” 方案。

9.4. 监控、控制和启动程序活动

程序活动能够使用特殊的工具监控和控制。

表 9.8. 监控和控制程序活动工具列表

软件包 流行度 大小 说明
coreutils V:898, I:999 17372 nice(1): 用指定的调度优先权运行一个程序
bsdutils V:646, I:999 419 renice(1): 调整一个目前在运行的进程的调度优先权值
procps V:743, I:999 1656 "/proc" 文件系统工具: ps(1), top(1), kill(1), watch(1), …
psmisc V:412, I:821 793 "/proc" 文件系统工具: killall(1), fuser(1), peekfd(1), pstree(1)
time V:12, I:214 129 time(1):运行一个程序,并从时间消耗方面来报告系统资源的使用
sysstat V:160, I:182 1923 sar(1), iostat(1), mpstat(1), …: linux 系统性能工具
isag V:0, I:4 117 sysstat 的交互式的系统活动图
lsof V:388, I:944 451 lsof(8): 使用 "-p" 选项列出被一个系统进程打开的文件
strace V:15, I:141 2367 strace(1):跟踪系统调用和信号
ltrace V:1, I:19 363 ltrace(1): 跟踪库调用
xtrace V:0, I:0 353 xtrace(1):跟踪 X11 客户端和服务器端之间的通信
powertop V:11, I:210 672 powertop(1):系统能耗使用信息
cron V:814, I:996 263 根据 cron(8) 后台守护进程(daemon)的调度运行一个进程
anacron V:404, I:475 107 用于非整天 24 小时运行系统的命令计划,类 cron
at V:136, I:240 169 at(1) 或 batch(1): 在一个特定的时间运行任务或在某一系统负载下运行

提示

procps 包提供了非常基础的监控、控制程序活动功能和启动程序功能。你应当把他们全部学会。

9.4.1. 进程耗时

显示 命令调用进程的时间消耗。

# time some_command >/dev/null
real    0m0.035s       # time on wall clock (elapsed real time)
user    0m0.000s       # time in user mode
sys     0m0.020s       # time in kernel mode

9.4.2. 调度优先级

进程的调度优先级是被一个进程优先级值控制。

表 9.9. 调度优先级值列表

进程优先级值 调度优先级
19 最低优先级进程
0 非常高的普通用户优先级进程
-20 root 用户非常高的优先级进程

# nice  -19 top                                      # very nice
# nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # very fast

在某些情况下,极端的进程优先级值会对系统造成伤害。小心使用这个命令。

9.4.3. ps 命令

在 Debian 系统上的 ps(1) 命令同时支持 BSD 和 SystemV 特征,有助于识别静态的进程活动。

表 9.10. ps 命令样式列表

样式 典型的命令 特征
BSD ps aux 显示 %CPU %MEM
System V ps -efH 显示 PPID

对于僵尸(死了的)子进程,你能够通过 "PPID" 字段的父进程 ID 来杀死它们。

pstree(1) 命令显示进程树。

9.4.4. top 命令

Debian 系统上的 top(1) 拥有丰富的特征,有助于识别进程有趣的动态行为。

它是一个交互式的全屏程序。你可以通过按"h"键来得到它的使用帮助,按"q"键来终止该程序。

9.4.5. 列出被一个进程打开的文件

你能够通过一个进程 ID(PID)来列出该进程所有打开的文件,例如,PID 为 1 的进程,使用下面的方式。

$ sudo lsof -p 1

PID=1 通常用于 init 程序.

9.4.6. 跟踪程序活动

你能够跟踪程序活动,使用strace(1), ltrace(1), xtrace(1) 来跟踪系统调用和信号、库调用、X11 客户端和服务器端之间的通信。

跟踪 ls 命令的系统调用。

$ sudo strace ls
提示

使用在 /usr/share/doc/strace/examples/ 中发现的 strace-graph 脚本来生成一个好看的树形视图

9.4.7. 识别使用文件和套接字的进程

你可以通过 fuser(1) 来识别出使用文件的进程,例如,用下面的方式识别出 "/var/log/mail.log" 由哪个进程打开。

$ sudo fuser -v /var/log/mail.log
                     USER        PID ACCESS COMMAND
/var/log/mail.log:   root       2946 F.... rsyslogd

你可以看到 "/var/log/mail.log" 是由 rsyslogd(8) 命令打开并写入。

你可以通过 fuser(1) 来识别出使用套接字的进程,例如,用下面的方式识别出 "smtp/tcp" 由哪个进程打开。

$ sudo fuser -v smtp/tcp
                     USER        PID ACCESS COMMAND
smtp/tcp:            Debian-exim   3379 F.... exim4

现在你知道你的系统运行 exim4(8) 来处理连接到 SMTP 端口 (25)的 TCP 连接.

9.4.8. 使用固定间隔重复一个命令

watch(1) 使用固定间隔重新执行一个命令,并全屏显示输出。

$ watch w

显示哪些人登录到系统,每 2 秒钟更新一次。

9.4.9. 使用文件循环来重复一个命令

通过匹配某些条件的文件来循环重复一个命令,有几种方法,例如,匹配全局模式"*.ext".

  • Shell 循环方式(参见 第 12.1.4 节 “shell 循环”):

for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done
  • find(1) 和 xargs(1) 联合:

find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command
  • find(1) 使用 "-exec" 选项并执行命令:

find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;
  • find(1) 使用 "-exec" 选项并执行一个短的 shell 脚本:

find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;

上面的列子确保适当处理怪异的文件名(如包含空格)。 find(1) 更多高级的用法,参见 第 10.1.5 节 “查找文件的语法”.

9.4.10. 从 GUI 启动一个程序

对于 命令行界面(command-line interface,CLI),$PATH 环境变量所指定的目录中第一个匹配相应名称的程序会被执行。参见 第 1.5.3 节 “"$PATH" 变量”。

对于遵从 freedesktop.org 标准的 图形用户界面(graphical user interface,GUI),/usr/share/applications/ 目录中的 *.desktop 文件给每个程序的 GUI 菜单显示提供了必要的属性。遵从Freedesktop.org xdg 菜单系统的每一个软件包,通过 "/usr/share/applications/"下 "*.desktop"提供的数据来安装它的菜单。 遵从 Freedesktop.org 标准的现代桌面环境,用 xdg-utils 软件包利用这些数据生成它们的菜单。参见"/usr/share/doc/xdg-utils/README"。

举个例子,chromium.desktop 文件中为 “Chromium 网络浏览器” 定义了相关属性,例如程序名 “Name”,程序执行路径和参数 “Exec”,所使用的图标 “Icon” 等等(参见 桌面配置项规范)。文件内容如下:

[Desktop Entry]
Version=1.0
Name=Chromium Web Browser
GenericName=Web Browser
Comment=Access the Internet
Comment[fr]=Explorer le Web
Exec=/usr/bin/chromium %U
Terminal=false
X-MultipleArgs=false
Type=Application
Icon=chromium
Categories=Network;WebBrowser;
MimeType=text/html;text/xml;application/xhtml_xml;x-scheme-handler/http;x-scheme-handler/https;
StartupWMClass=Chromium
StartupNotify=true

这是一个较为简单的说明。*.desktop 文件像下面那样被搜寻。

桌面环境设置 $XDG_DATA_HOME$XDG_DATA_DIR 环境变量。举个例子,在 GNOME 3 中:

  • 未设置 $XDG_DATA_HOME。(将使用默认值 $HOME/.local/share。)

  • $XDG_DATA_DIRS 被设置为 /usr/share/gnome:/usr/local/share/:/usr/share/

基准目录(参见 XDG Base Directory Specification)和应用程序目录如下所示。

  • $HOME/.local/share/$HOME/.local/share/applications/

  • /usr/share/gnome//usr/share/gnome/applications/

  • /usr/local/share//usr/local/share/applications/

  • /usr/share//usr/share/applications/

*.desktop 文件将按照这个顺序在这些 applications 目录中进行搜寻。

提示

要建立一个用户自定义的 GUI 菜单项,需要在 $HOME/.local/share/applications/ 目录中添加一个 *.desktop 文件。

提示

相似地,如果在这些基准目录下的 autostart 目录中建立了一个 *.desktop 文件,则 *.desktop 文件中指定的程序会在桌面环境启动时自动执行。参见 Desktop Application Autostart Specification。

提示

相似地,如果在 $HOME/Desktop 目录中建立了一个 *.desktop 文件并且桌面环境被配置为支持桌面图标启动器功能,则点击图标时指定的程序会被执行。请注意,$HOME/Desktop 目录的实际名称与语言环境有关。参见 xdg-user-dirs-update(1)。

9.4.11. 自定义被启动的程序

一些程序会被另一个程序自动启动。下面是自定义该过程的方法。

  • 应用程序配置菜单:

    • GNOME3 桌面:“设置” → “系统” → “详细信息” → “默认应用程序”

    • KDE 桌面: "K" → "Control Center 控制中心" → "KDE Components 组件" → "Component Chooser 组件选择器"

    • Iceweasel 浏览器:“编辑” → “首选项” → “应用程序”

    • mc(1):“/etc/mc/mc.ext

  • 例如 “$BROWSER”、“$EDITOR”、“$VISUAL” 和 “$PAGER” 这样的环境变量(参见 environ(7))

  • 用于例如 “editor”、“view”、“x-www-browser”、“gnome-www-browser” 和 “www-browser” 这样的程序的 update-alternatives(1) 系统(参见 第 1.4.7 节 “设置默认文本编辑器”)

  • ~/.mailcap” 和 “/etc/mailcap” 文件的内容关联了程序的 MIME 类型(参见 mailcap(5))

  • ~/.mime.types” 和 “/etc/mime.types” 文件的内容关联了 MIME 类型的文件扩展名(参见 run-mailcap(1))

提示

update-mime(8) 会更新 "/etc/mailcap" 文件,期间会用到 "/etc/mailcap.order" 文件 (参见 mailcap.order(5)).

提示

debianutils 软件包提供 sensible-browser(1)、sensible-editor(1) 和 sensible-pager(1),它们可以分别对要调用的编辑器、分页程序和网络浏览器作出明智的选择。我建议你阅读那些 shell 脚本。

提示

为了在 GUI(图形用户界面)下运行例如 mutt 这样的控制台应用程序来作为你的首选应用程序,你应该像下面那样建立一个 GUI(图形用户界面)应用程序并设置 “/usr/local/bin/mutt-term” 为你想要启动的首选应用程序。

# cat /usr/local/bin/mutt-term <
提示

GUI(图形用户界面)应用程序能够很容易的放在特定环境变量下执行,在它相应的 *.desktop 文件里面用于"Exec"的程序不定义完整执行路径。你可以启用非英文键盘输入到 kitty:在安装需要的输入方式软件包后,使用一个 ibusfcitx5 的输入框架,并按如下方式创建一个 shell 脚本"/usr/local/bin/kitty"。

# cat /usr/local/bin/kitty <

这个 kitty 脚本可以选择放在"~/bin/" 或 "~/.local/bin/"目录,只要这些目录在 "$PATH" 中,比 "/usr/bin/"目录更早 定义。

9.4.12. 杀死一个进程

使用 kill(1) 通过进程 ID 来杀死(发送一个信号)一个进程。

使用 killall(1) 或 pkill(1) 通过进程命令的名字或其它属性来做同样的事情。

表 9.11. kill 命令常用信号列表

信号值 信号名 操作 注释
0 --- 没有信号发送(参见 kill(2)) 检查进程是否运行
1 SIGHUP 终止进程 从终端断开连接(信号 挂起)
2 SIGINT 终止进程 从键盘中断 (CTRL-C)
3 SIGQUIT 终止进程并触发 dump core 从键盘退出 (CTRL-\)
9 SIGKILL 终止进程 不可阻塞的 kill 信号
15 SIGTERM 终止进程 可被阻塞的终止信号

9.4.13. 单次任务时间安排

运行 at(1) 命令来安排一次性的工作。

$ echo 'command -args'| at 3:40 monday

9.4.14. 定时任务安排

使用 cron(8) 来进行定时任务安排。参见 crontab(1) 和 crontab(5).

你能够作为一个普通用户定时运行一个进程,比如, foo 使用 "crontab -e" 命令创建一个 crontab(5) 的文件 "/var/spool/cron/crontabs/foo"。

这里是一个 crontab(5) 文件的列子。

# use /bin/sh to run commands, no matter what /etc/passwd says
SHELL=/bin/sh
# mail any output to paul, no matter whose crontab this is
MAILTO=paul
# Min Hour DayOfMonth Month DayOfWeek command (Day... are OR'ed)
# run at 00:05, every day
5  0  *  * *   $HOME/bin/daily.job >> $HOME/tmp/out 2>&1
# run at 14:15 on the first of every month -- output mailed to paul
15 14 1  * *   $HOME/bin/monthly
# run at 22:00 on weekdays(1-5), annoy Joe. % for newline, last % for cc:
0 22 *   * 1-5 mail -s "It's 10pm" joe%Joe,%%Where are your kids?%.%%
23 */2 1 2 *   echo "run 23 minutes after 0am, 2am, 4am ..., on Feb 1"
5  4 *   * sun echo "run at 04:05 every Sunday"
# run at 03:40 on the first Monday of each month
40 3 1-7 * *   [ "$(date +%a)" == "Mon" ] && command -args
提示

对那些非连续运行的系统,安装 anacron 软件包来定时执行周期性的命令,命令在接近机器启动的时间运行,并允许有特定的时间间隔。参见 anacron(8) 和 anacrontab(5).

提示

对于定时系统维护脚本,你能够以root 账户定时运行,把这类脚本放入 "/etc/cron.hourly/", "/etc/cron.daily/", "/etc/cron.weekly/", 或 "/etc/cron.monthly/". 这些脚本的执行时间,可以通过 "/etc/crontab" 和 "/etc/anacrontab" 来定制。

cron 后台守护进程(daemon)不存在时,Systemd 也有按时间计划运行程序的低级能力。例如, /lib/systemd/system/apt-daily.timer/lib/systemd/system/apt-daily.service 建立每天的 apt 下载行动。参见 systemd.timer(5) 。

9.4.15. Alt-SysRq 键

按 Alt-SysRq (PrtScr)组合键跟一个字母按键,进行不可思议的系统应急控制。

表 9.12. 著名的 SAK 命令键列表

Alt-SysRq 之后的键 行为描述
k kill 杀死在当前虚拟控制台上的所有进程 (SAK)
s sync 同步刷新所有已经挂载的文件系统来避免数据损坏
u 重新以只读方式挂载所有已挂载的文件系统 (umount)
分享名称:【Debian参考手册】第 9 章 系统技巧
标题链接:http://www.shufengxianlan.com/qtweb/news41/339791.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联