Debian监控/控制/启动程序详解

2024-11-09 2

在Debian系统中,监控和控制程序活动是系统管理员和开发者的重要任务之一。为了有效地进行这一任务,存在许多特殊的工具和技术可以使用。本教程主要介绍了Debian程序活动的多种操作步骤,包括进程耗时、调度优先级、ps 命令、top 命令、跟踪程序活动等等。

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

软件包流行度大小说明
coreutilsV:881, I:99918307nice(1): 用指定的调度优先权运行一个程序
bsdutilsV:518, I:999356renice(1): 调整一个目前在运行的进程的调度优先权值
procpsV:759, I:9992391/proc 文件系统工具: ps(1), top(1), kill(1), watch(1), …
psmiscV:416, I:777908/proc 文件系统工具: killall(1), fuser(1), peekfd(1), pstree(1)
timeV:8, I:137129time(1):运行一个程序,并从时间消耗方面来报告系统资源的使用
sysstatV:151, I:1731904sar(1), iostat(1), mpstat(1), …: linux 系统性能工具
isagV:0, I:3109sysstat 的交互式的系统活动图
lsofV:419, I:944482lsof(8): 使用 “-p” 选项列出被一个系统进程打开的文件
straceV:12, I:1212897strace(1):跟踪系统调用和信号
ltraceV:0, I:16330ltrace(1): 跟踪库调用
xtraceV:0, I:0353xtrace(1):跟踪 X11 客户端和服务器端之间的通信
powertopV:18, I:215677powertop(1):系统能耗使用信息
cronV:870, I:995241根据 cron(8) 后台守护进程(daemon)的调度运行一个进程
anacronV:392, I:47493用于非整天 24 小时运行系统的命令计划,类 cron
atV:103, I:159158at(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非常高的普通用户优先级进程
-20root 用户非常高的优先级进程
# 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命令样式列表:

样式典型的命令特征
BSDps aux显示 %CPU %MEM
System Vps -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没有信号发送检查进程是否运行
1SIGHUP终止进程从终端断开连接(信号 挂起)
2SIGINT终止进程从键盘中断 (CTRL-C)
3SIGQUIT终止进程并触发 dump core从键盘退出 (CTRL-\)
9SIGKILL终止进程不可阻塞的 kill 信号
15SIGTERM终止进程可被阻塞的终止信号

十二、单次任务时间安排

运行 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 之后的键行为描述
kkill 杀死在当前虚拟控制台上的所有进程 (SAK)
ssync 同步刷新所有已经挂载的文件系统来避免数据损坏
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(实时) 任务优先级(打开)