在Debian系统中,监控和控制程序活动是系统管理员和开发者的重要任务之一。为了有效地进行这一任务,存在许多特殊的工具和技术可以使用。本教程主要介绍了Debian程序活动的多种操作步骤,包括进程耗时、调度优先级、ps 命令、top 命令、跟踪程序活动等等。
监控和控制程序活动工具列表:
软件包 | 流行度 | 大小 | 说明 |
coreutils | V:881, I:999 | 18307 | nice(1): 用指定的调度优先权运行一个程序 |
bsdutils | V:518, I:999 | 356 | renice(1): 调整一个目前在运行的进程的调度优先权值 |
procps | V:759, I:999 | 2391 | /proc 文件系统工具: ps(1), top(1), kill(1), watch(1), … |
psmisc | V:416, I:777 | 908 | /proc 文件系统工具: killall(1), fuser(1), peekfd(1), pstree(1) |
time | V:8, I:137 | 129 | time(1):运行一个程序,并从时间消耗方面来报告系统资源的使用 |
sysstat | V:151, I:173 | 1904 | sar(1), iostat(1), mpstat(1), …: linux 系统性能工具 |
isag | V:0, I:3 | 109 | sysstat 的交互式的系统活动图 |
lsof | V:419, I:944 | 482 | lsof(8): 使用 “-p” 选项列出被一个系统进程打开的文件 |
strace | V:12, I:121 | 2897 | strace(1):跟踪系统调用和信号 |
ltrace | V:0, I:16 | 330 | ltrace(1): 跟踪库调用 |
xtrace | V:0, I:0 | 353 | xtrace(1):跟踪 X11 客户端和服务器端之间的通信 |
powertop | V:18, I:215 | 677 | powertop(1):系统能耗使用信息 |
cron | V:870, I:995 | 241 | 根据 cron(8) 后台守护进程(daemon)的调度运行一个进程 |
anacron | V:392, I:474 | 93 | 用于非整天 24 小时运行系统的命令计划,类 cron |
at | V:103, I:159 | 158 | at(1) 或 batch(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
二、调度优先级
进程的调度优先级是被一个进程优先级值控制。
调度优先级值列表:
进程优先级值 | 调度优先级 |
---|---|
19 | 最低优先级进程 |
0 | 非常高的普通用户优先级进程 |
-20 | root 用户非常高的优先级进程 |
# nice -19 top # very nice # nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # very fast
注意:在某些情况下,极端的进程优先级值会对系统造成伤害,请谨慎使用这些命令。
三、ps命令
在 Debian 系统上的 ps(1) 命令同时支持 BSD 和 SystemV 特征,有助于识别静态的进程活动。
pa命令样式列表:
样式 | 典型的命令 | 特征 |
---|---|---|
BSD | ps aux |
显示 %CPU %MEM |
System V | ps -efH |
显示 PPID |
对于僵尸(死了的)子进程,你能够通过 “PPID” 字段的父进程 ID 来杀死它们。
pstree(1) 命令显示进程树。
四、top命令
Debian 系统上的 top(1) 拥有丰富的特征,有助于识别进程有趣的动态行为。它是一个交互式的全屏程序。你可以通过按”h”键来得到它的使用帮助,按”q”键来终止该程序。
五、进程打开的文件
你能够通过一个进程 ID(PID)来列出该进程所有打开的文件,例如,PID 为 1 的进程,使用下面的方式。
$ sudo lsof -p 1
PID=1 通常用于 init 程序.
六、跟踪程序活动
你能够跟踪程序活动,使用strace(1), ltrace(1), xtrace(1) 来跟踪系统调用和信号、库调用、X11 客户端和服务器端之间的通信。
跟踪 ls 命令的系统调用:
$ sudo strace ls
使用在 /usr/share/doc/strace/examples/ 中发现的 strace-graph 脚本来生成一个好看的树形视图
七、识别进程
你可以通过 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 连接.
八、重复一个命令
1、使用文件循环来重复一个命令
watch(1) 使用固定间隔重新执行一个命令,并全屏显示输出。
$ watch w
显示哪些人登录到系统,每 2 秒钟更新一次。
2、使用文件循环来重复一个命令
通过匹配某些条件的文件来循环重复一个命令,有几种方法,例如,匹配全局模式”*.ext”.
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'" \;
上面的列子确保适当处理怪异的文件名(如包含空格)。
九、GUI启动一个程序
对于 命令行界面(command-line interface,CLI),$PATH 环境变量所指定的目录中第一个匹配相应名称的程序会被执行。
对于遵从 freedesktop.org 标准的 图形用户界面(graphical user interface,GUI),/usr/share/applications/ 目录中的 *.desktop 文件给每个程序的 GUI 菜单显示提供了必要的属性。遵从Freedesktop.org xdg 菜单系统的每一个软件包,通过 “/usr/share/applications/”下 “*.desktop”提供的数据来安装它的菜单。 遵从 Freedesktop.org 标准的现代桌面环境,用 xdg-utils 软件包利用这些数据生成它们的菜单。
举个例子,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/。
基准目录和应用程序目录如下所示。
- $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 文件。
- “Exec=…” 行不会由 shell 解析。如果需要设置环境变量,使用 env(1) command。
- 相似地,如果在这些基准目录下的 autostart 目录中建立了一个 *.desktop 文件,则 *.desktop 文件中指定的程序会在桌面环境启动时自动执行。
- 相似地,如果在 $HOME/Desktop 目录中建立了一个 *.desktop 文件并且桌面环境被配置为支持桌面图标启动器功能,则点击图标时指定的程序会被执行。请注意,$HOME/Desktop 目录的实际名称与语言环境有关。
十、自定义程序
一些程序会被另一个程序自动启动。下面是自定义该过程的方法。
1、应用程序配置菜单:
- GNOME3 桌面:“设置” → “系统” → “详细信息” → “默认应用程序”;
- KDE 桌面: “K” → “Control Center 控制中心” → “KDE Components 组件” → “Component Chooser 组件选择器”;
- Iceweasel 浏览器:“编辑” → “首选项” → “应用程序”;
- mc(1):“/etc/mc/mc.ext”。
2、例如 “$BROWSER”、“$EDITOR”、“$VISUAL” 和 “$PAGER” 这样的环境变量。
3、用于例如 “editor”、“view”、“x-www-browser”、“gnome-www-browser” 和 “www-browser” 这样的程序的 update-alternatives(1) 系统
4、“~/.mailcap” 和 “/etc/mailcap” 文件的内容关联了程序的 MIME 类型。
5、“~/.mime.types” 和 “/etc/mime.types” 文件的内容关联了 MIME 类型的文件扩展名。
注意:
- update-mime(8) 会更新 “/etc/mailcap” 文件,期间会用到 “/etc/mailcap.order” 文件;
- debianutils 软件包提供 sensible-browser(1)、sensible-editor(1) 和 sensible-pager(1),它们可以分别对要调用的编辑器、分页程序和网络浏览器作出明智的选择;
- 为了在 GUI(图形用户界面)下运行例如 mutt 这样的控制台应用程序来作为你的首选应用程序,你应该像下面那样建立一个 GUI(图形用户界面)应用程序并设置 “/usr/local/bin/mutt-term” 为你想要启动的首选应用程序;
# cat /usr/local/bin/mutt-term <<EOF #!/bin/sh gnome-terminal -e "mutt \$@" EOF # chmod 755 /usr/local/bin/mutt-term
十一、杀死一个进程
使用 kill(1) 通过进程 ID 来杀死(发送一个信号)一个进程。
使用 killall(1) 或 pkill(1) 通过进程命令的名字或其它属性来做同样的事情。
kill 命令常用信号列表:
信号值 | 信号名 | 操作 | 注释 |
---|---|---|---|
0 | — | 没有信号发送 | 检查进程是否运行 |
1 | SIGHUP | 终止进程 | 从终端断开连接(信号 挂起) |
2 | SIGINT | 终止进程 | 从键盘中断 (CTRL-C ) |
3 | SIGQUIT | 终止进程并触发 dump core | 从键盘退出 (CTRL-\ ) |
9 | SIGKILL | 终止进程 | 不可阻塞的 kill 信号 |
15 | SIGTERM | 终止进程 | 可被阻塞的终止信号 |
十二、单次任务时间安排
运行 at(1) 命令来安排一次性的工作。
$ echo 'command -args'| at 3:40 monday
十三、定时任务安排
使用 cron(8) 来进行定时任务安排。你能够作为一个普通用户定时运行一个进程,比如, foo 使用 “crontab -e” 命令创建一个 crontab(5) 的文件 “/var/spool/cron/crontabs/foo”。
这里是一个 crontab(5) 文件的列子。
# use /usr/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 软件包来定时执行周期性的命令,命令在接近机器启动的时间运行,并允许有特定的时间间隔。
对于定时系统维护脚本,你能够以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 能够执行计划程序,不仅基于时间事件,还能够基于挂载事件。
十五、Alt-SysRq键
按 Alt-SysRq (PrtScr)组合键跟一个字母按键,进行不可思议的系统应急控制。
著名的 SAK 命令键列表:
Alt-SysRq 之后的键 | 行为描述 |
---|---|
k |
kill 杀死在当前虚拟控制台上的所有进程 (SAK) |
s |
sync 同步刷新所有已经挂载的文件系统来避免数据损坏 |
u |
重新以只读方式挂载所有已挂载的文件系统 (umount) |
r |
在 X 崩溃后,从 raw 模式恢复键盘 |
从 SSH 终端等,你能够通过向 “/proc/sysrq-trigger” 写入内容来使用 Alt-SysRq 特性。例如,从 root shell 提示符运行 “echo s > /proc/sysrq-trigger; echo u > /proc/sysrq-trigger” 来 syncs 和 umounts 所有已挂载的文件系统。
目前(2021) Debian amd64 Linux 内核为 /proc/sys/kernel/sysrq=438=0b110110110:
- 2 = 0x2 – 启用控制台日志级别控制 (打开)
- 4 = 0x4 – 启用键盘控制 (SAK, unraw) (打开)
- 8 = 0x8 – 启用进程调试转储(debugging dumps of processes)等。(关闭)
- 16 = 0x10 – 启用 sync 命令(打开)
- 32 = 0x20 – 启用只读重新挂载(打开)
- 64 = 0x40 – 启用进程信号 (term, kill, oom-kill) (关闭)
- 128 = 0x80 – 允许重启、关闭电源(打开)
- 256 = 0x100 – 允许调整所有 RT(实时) 任务优先级(打开)