在Debian系統(tǒng)中,監(jiān)控和控制程序活動(dòng)是系統(tǒng)管理員和開(kāi)發(fā)者的重要任務(wù)之一。為了有效地進(jìn)行這一任務(wù),存在許多特殊的工具和技術(shù)可以使用。本教程主要介紹了Debian程序活動(dòng)的多種操作步驟,包括進(jìn)程耗時(shí)、調(diào)度優(yōu)先級(jí)、ps 命令、top 命令、跟蹤程序活動(dòng)等等。
監(jiān)控和控制程序活動(dòng)工具列表:
軟件包 | 流行度 | 大小 | 說(shuō)明 |
coreutils | V:881, I:999 | 18307 | nice(1): 用指定的調(diào)度優(yōu)先權(quán)運(yùn)行一個(gè)程序 |
bsdutils | V:518, I:999 | 356 | renice(1): 調(diào)整一個(gè)目前在運(yùn)行的進(jìn)程的調(diào)度優(yōu)先權(quán)值 |
procps | V:759, I:999 | 2391 | /proc 文件系統(tǒng)工具: ps(1), top(1), kill(1), watch(1), … |
psmisc | V:416, I:777 | 908 | /proc 文件系統(tǒng)工具: killall(1), fuser(1), peekfd(1), pstree(1) |
time | V:8, I:137 | 129 | time(1):運(yùn)行一個(gè)程序,并從時(shí)間消耗方面來(lái)報(bào)告系統(tǒng)資源的使用 |
sysstat | V:151, I:173 | 1904 | sar(1), iostat(1), mpstat(1), …: linux 系統(tǒng)性能工具 |
isag | V:0, I:3 | 109 | sysstat 的交互式的系統(tǒng)活動(dòng)圖 |
lsof | V:419, I:944 | 482 | lsof(8): 使用 “-p” 選項(xiàng)列出被一個(gè)系統(tǒng)進(jìn)程打開(kāi)的文件 |
strace | V:12, I:121 | 2897 | strace(1):跟蹤系統(tǒng)調(diào)用和信號(hào) |
ltrace | V:0, I:16 | 330 | ltrace(1): 跟蹤庫(kù)調(diào)用 |
xtrace | V:0, I:0 | 353 | xtrace(1):跟蹤 X11 客戶端和服務(wù)器端之間的通信 |
powertop | V:18, I:215 | 677 | powertop(1):系統(tǒng)能耗使用信息 |
cron | V:870, I:995 | 241 | 根據(jù) cron(8) 后臺(tái)守護(hù)進(jìn)程(daemon)的調(diào)度運(yùn)行一個(gè)進(jìn)程 |
anacron | V:392, I:474 | 93 | 用于非整天 24 小時(shí)運(yùn)行系統(tǒng)的命令計(jì)劃,類 cron |
at | V:103, I:159 | 158 | at(1) 或 batch(1): 在一個(gè)特定的時(shí)間運(yùn)行任務(wù)或在某一系統(tǒng)負(fù)載下運(yùn)行 |
一、進(jìn)程耗時(shí)
顯示命令調(diào)用進(jìn)程的時(shí)間消耗。
# 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
二、調(diào)度優(yōu)先級(jí)
進(jìn)程的調(diào)度優(yōu)先級(jí)是被一個(gè)進(jìn)程優(yōu)先級(jí)值控制。
調(diào)度優(yōu)先級(jí)值列表:
進(jìn)程優(yōu)先級(jí)值 | 調(diào)度優(yōu)先級(jí) |
---|---|
19 | 最低優(yōu)先級(jí)進(jìn)程 |
0 | 非常高的普通用戶優(yōu)先級(jí)進(jìn)程 |
-20 | root 用戶非常高的優(yōu)先級(jí)進(jìn)程 |
# nice -19 top # very nice # nice --20 wodim -v -eject speed=2 dev=0,0 disk.img # very fast
注意:在某些情況下,極端的進(jìn)程優(yōu)先級(jí)值會(huì)對(duì)系統(tǒng)造成傷害,請(qǐng)謹(jǐn)慎使用這些命令。
三、ps命令
在 Debian 系統(tǒng)上的 ps(1) 命令同時(shí)支持 BSD 和 SystemV 特征,有助于識(shí)別靜態(tài)的進(jìn)程活動(dòng)。
pa命令樣式列表:
樣式 | 典型的命令 | 特征 |
---|---|---|
BSD | ps aux |
顯示 %CPU %MEM |
System V | ps -efH |
顯示 PPID |
對(duì)于僵尸(死了的)子進(jìn)程,你能夠通過(guò) “PPID” 字段的父進(jìn)程 ID 來(lái)殺死它們。
pstree(1) 命令顯示進(jìn)程樹(shù)。
四、top命令
Debian 系統(tǒng)上的 top(1) 擁有豐富的特征,有助于識(shí)別進(jìn)程有趣的動(dòng)態(tài)行為。它是一個(gè)交互式的全屏程序。你可以通過(guò)按”h”鍵來(lái)得到它的使用幫助,按”q”鍵來(lái)終止該程序。
五、進(jìn)程打開(kāi)的文件
你能夠通過(guò)一個(gè)進(jìn)程 ID(PID)來(lái)列出該進(jìn)程所有打開(kāi)的文件,例如,PID 為 1 的進(jìn)程,使用下面的方式。
$ sudo lsof -p 1
PID=1 通常用于 init 程序.
六、跟蹤程序活動(dòng)
你能夠跟蹤程序活動(dòng),使用strace(1), ltrace(1), xtrace(1) 來(lái)跟蹤系統(tǒng)調(diào)用和信號(hào)、庫(kù)調(diào)用、X11 客戶端和服務(wù)器端之間的通信。
跟蹤 ls 命令的系統(tǒng)調(diào)用:
$ sudo strace ls
使用在 /usr/share/doc/strace/examples/ 中發(fā)現(xiàn)的 strace-graph 腳本來(lái)生成一個(gè)好看的樹(shù)形視圖
七、識(shí)別進(jìn)程
你可以通過(guò) fuser(1) 來(lái)識(shí)別出使用文件的進(jìn)程,例如,用下面的方式識(shí)別出 “/var/log/mail.log” 由哪個(gè)進(jìn)程打開(kāi)。
$ 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) 命令打開(kāi)并寫入。通過(guò) fuser(1) 來(lái)識(shí)別出使用套接字的進(jìn)程,例如,用下面的方式識(shí)別出 “smtp/tcp” 由哪個(gè)進(jìn)程打開(kāi)。
$ sudo fuser -v smtp/tcp USER PID ACCESS COMMAND smtp/tcp: Debian-exim 3379 F.... exim4
現(xiàn)在你知道你的系統(tǒng)運(yùn)行 exim4(8) 來(lái)處理連接到 SMTP 端口 (25)的 TCP 連接.
八、重復(fù)一個(gè)命令
1、使用文件循環(huán)來(lái)重復(fù)一個(gè)命令
watch(1) 使用固定間隔重新執(zhí)行一個(gè)命令,并全屏顯示輸出。
$ watch w
顯示哪些人登錄到系統(tǒng),每 2 秒鐘更新一次。
2、使用文件循環(huán)來(lái)重復(fù)一個(gè)命令
通過(guò)匹配某些條件的文件來(lái)循環(huán)重復(fù)一個(gè)命令,有幾種方法,例如,匹配全局模式”*.ext”.
Shell 循環(huán)方式:
for x in *.ext; do if [ -f "$x"]; then command "$x" ; fi; done
find(1) 和 xargs(1) 聯(lián)合:
find . -type f -maxdepth 1 -name '*.ext' -print0 | xargs -0 -n 1 command
find(1) 使用 “-exec” 選項(xiàng)并執(zhí)行命令:
find . -type f -maxdepth 1 -name '*.ext' -exec command '{}' \;
find(1) 使用 “-exec” 選項(xiàng)并執(zhí)行一個(gè)短的 shell 腳本:
find . -type f -maxdepth 1 -name '*.ext' -exec sh -c "command '{}' && echo 'successful'" \;
上面的列子確保適當(dāng)處理怪異的文件名(如包含空格)。
九、GUI啟動(dòng)一個(gè)程序
對(duì)于 命令行界面(command-line interface,CLI),$PATH 環(huán)境變量所指定的目錄中第一個(gè)匹配相應(yīng)名稱的程序會(huì)被執(zhí)行。
對(duì)于遵從 freedesktop.org 標(biāo)準(zhǔn)的 圖形用戶界面(graphical user interface,GUI),/usr/share/applications/ 目錄中的 *.desktop 文件給每個(gè)程序的 GUI 菜單顯示提供了必要的屬性。遵從Freedesktop.org xdg 菜單系統(tǒng)的每一個(gè)軟件包,通過(guò) “/usr/share/applications/”下 “*.desktop”提供的數(shù)據(jù)來(lái)安裝它的菜單。 遵從 Freedesktop.org 標(biāo)準(zhǔn)的現(xiàn)代桌面環(huán)境,用 xdg-utils 軟件包利用這些數(shù)據(jù)生成它們的菜單。
舉個(gè)例子,chromium.desktop 文件中為 “Chromium 網(wǎng)絡(luò)瀏覽器” 定義了相關(guān)屬性,例如程序名 “Name”,程序執(zhí)行路徑和參數(shù) “Exec”,所使用的圖標(biāo) “Icon” 等等。文件內(nèi)容如下:
[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
這是一個(gè)較為簡(jiǎn)單的說(shuō)明。*.desktop 文件像下面那樣被搜尋。
桌面環(huán)境設(shè)置 $XDG_DATA_HOME 和 $XDG_DATA_DIR 環(huán)境變量。舉個(gè)例子,在 GNOME 3 中:
- 未設(shè)置 $XDG_DATA_HOME;(將使用默認(rèn)值 $HOME/.local/share。)
- $XDG_DATA_DIRS 被設(shè)置為 /usr/share/gnome:/usr/local/share/:/usr/share/。
基準(zhǔn)目錄和應(yīng)用程序目錄如下所示。
- $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 文件將按照這個(gè)順序在這些 applications 目錄中進(jìn)行搜尋。
注意:
- 要建立一個(gè)用戶自定義的 GUI 菜單項(xiàng),需要在 $HOME/.local/share/applications/ 目錄中添加一個(gè) *.desktop 文件。
- “Exec=…” 行不會(huì)由 shell 解析。如果需要設(shè)置環(huán)境變量,使用 env(1) command。
- 相似地,如果在這些基準(zhǔn)目錄下的 autostart 目錄中建立了一個(gè) *.desktop 文件,則 *.desktop 文件中指定的程序會(huì)在桌面環(huán)境啟動(dòng)時(shí)自動(dòng)執(zhí)行。
- 相似地,如果在 $HOME/Desktop 目錄中建立了一個(gè) *.desktop 文件并且桌面環(huán)境被配置為支持桌面圖標(biāo)啟動(dòng)器功能,則點(diǎn)擊圖標(biāo)時(shí)指定的程序會(huì)被執(zhí)行。請(qǐng)注意,$HOME/Desktop 目錄的實(shí)際名稱與語(yǔ)言環(huán)境有關(guān)。
十、自定義程序
一些程序會(huì)被另一個(gè)程序自動(dòng)啟動(dòng)。下面是自定義該過(guò)程的方法。
1、應(yīng)用程序配置菜單:
- GNOME3 桌面:“設(shè)置” → “系統(tǒng)” → “詳細(xì)信息” → “默認(rèn)應(yīng)用程序”;
- KDE 桌面: “K” → “Control Center 控制中心” → “KDE Components 組件” → “Component Chooser 組件選擇器”;
- Iceweasel 瀏覽器:“編輯” → “首選項(xiàng)” → “應(yīng)用程序”;
- mc(1):“/etc/mc/mc.ext”。
2、例如 “$BROWSER”、“$EDITOR”、“$VISUAL” 和 “$PAGER” 這樣的環(huán)境變量。
3、用于例如 “editor”、“view”、“x-www-browser”、“gnome-www-browser” 和 “www-browser” 這樣的程序的 update-alternatives(1) 系統(tǒng)
4、“~/.mailcap” 和 “/etc/mailcap” 文件的內(nèi)容關(guān)聯(lián)了程序的 MIME 類型。
5、“~/.mime.types” 和 “/etc/mime.types” 文件的內(nèi)容關(guān)聯(lián)了 MIME 類型的文件擴(kuò)展名。
注意:
- update-mime(8) 會(huì)更新 “/etc/mailcap” 文件,期間會(huì)用到 “/etc/mailcap.order” 文件;
- debianutils 軟件包提供 sensible-browser(1)、sensible-editor(1) 和 sensible-pager(1),它們可以分別對(duì)要調(diào)用的編輯器、分頁(yè)程序和網(wǎng)絡(luò)瀏覽器作出明智的選擇;
- 為了在 GUI(圖形用戶界面)下運(yùn)行例如 mutt 這樣的控制臺(tái)應(yīng)用程序來(lái)作為你的首選應(yīng)用程序,你應(yīng)該像下面那樣建立一個(gè) GUI(圖形用戶界面)應(yīng)用程序并設(shè)置 “/usr/local/bin/mutt-term” 為你想要啟動(dòng)的首選應(yīng)用程序;
# cat /usr/local/bin/mutt-term <<EOF #!/bin/sh gnome-terminal -e "mutt \$@" EOF # chmod 755 /usr/local/bin/mutt-term
十一、殺死一個(gè)進(jìn)程
使用 kill(1) 通過(guò)進(jìn)程 ID 來(lái)殺死(發(fā)送一個(gè)信號(hào))一個(gè)進(jìn)程。
使用 killall(1) 或 pkill(1) 通過(guò)進(jìn)程命令的名字或其它屬性來(lái)做同樣的事情。
kill 命令常用信號(hào)列表:
信號(hào)值 | 信號(hào)名 | 操作 | 注釋 |
---|---|---|---|
0 | — | 沒(méi)有信號(hào)發(fā)送 | 檢查進(jìn)程是否運(yùn)行 |
1 | SIGHUP | 終止進(jìn)程 | 從終端斷開(kāi)連接(信號(hào) 掛起) |
2 | SIGINT | 終止進(jìn)程 | 從鍵盤中斷 (CTRL-C ) |
3 | SIGQUIT | 終止進(jìn)程并觸發(fā)?dump core | 從鍵盤退出 (CTRL-\ ) |
9 | SIGKILL | 終止進(jìn)程 | 不可阻塞的 kill 信號(hào) |
15 | SIGTERM | 終止進(jìn)程 | 可被阻塞的終止信號(hào) |
十二、單次任務(wù)時(shí)間安排
運(yùn)行 at(1) 命令來(lái)安排一次性的工作。
$ echo 'command -args'| at 3:40 monday
十三、定時(shí)任務(wù)安排
使用 cron(8) 來(lái)進(jìn)行定時(shí)任務(wù)安排。你能夠作為一個(gè)普通用戶定時(shí)運(yùn)行一個(gè)進(jìn)程,比如, foo 使用 “crontab -e” 命令創(chuàng)建一個(gè) crontab(5) 的文件 “/var/spool/cron/crontabs/foo”。
這里是一個(gè) 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
對(duì)那些非連續(xù)運(yùn)行的系統(tǒng),安裝 anacron 軟件包來(lái)定時(shí)執(zhí)行周期性的命令,命令在接近機(jī)器啟動(dòng)的時(shí)間運(yùn)行,并允許有特定的時(shí)間間隔。
對(duì)于定時(shí)系統(tǒng)維護(hù)腳本,你能夠以root 賬戶定時(shí)運(yùn)行,把這類腳本放入 “/etc/cron.hourly/”, “/etc/cron.daily/”, “/etc/cron.weekly/”, 或 “/etc/cron.monthly/”. 這些腳本的執(zhí)行時(shí)間,可以通過(guò) “/etc/crontab” 和 “/etc/anacrontab” 來(lái)定制。
cron 后臺(tái)守護(hù)進(jìn)程(daemon)不存在時(shí),Systemd 也有按時(shí)間計(jì)劃運(yùn)行程序的低級(jí)能力。例如, /lib/systemd/system/apt-daily.timer 和 /lib/systemd/system/apt-daily.service 建立每天的 apt 下載行動(dòng)。
十四、基于事件的計(jì)劃任務(wù)
Systemd 能夠執(zhí)行計(jì)劃程序,不僅基于時(shí)間事件,還能夠基于掛載事件。
十五、Alt-SysRq鍵
按 Alt-SysRq (PrtScr)組合鍵跟一個(gè)字母按鍵,進(jìn)行不可思議的系統(tǒng)應(yīng)急控制。
著名的 SAK 命令鍵列表:
Alt-SysRq 之后的鍵 | 行為描述 |
---|---|
k |
kill 殺死在當(dāng)前虛擬控制臺(tái)上的所有進(jìn)程 (SAK) |
s |
sync 同步刷新所有已經(jīng)掛載的文件系統(tǒng)來(lái)避免數(shù)據(jù)損壞 |
u |
重新以只讀方式掛載所有已掛載的文件系統(tǒng) (umount) |
r |
在 X 崩潰后,從?raw 模式恢復(fù)鍵盤 |
從 SSH 終端等,你能夠通過(guò)向 “/proc/sysrq-trigger” 寫入內(nèi)容來(lái)使用 Alt-SysRq 特性。例如,從 root shell 提示符運(yùn)行 “echo s > /proc/sysrq-trigger; echo u > /proc/sysrq-trigger” 來(lái) syncs 和 umounts 所有已掛載的文件系統(tǒng)。
目前(2021) Debian amd64 Linux 內(nèi)核為 /proc/sys/kernel/sysrq=438=0b110110110:
- 2 = 0x2 – 啟用控制臺(tái)日志級(jí)別控制 (打開(kāi))
- 4 = 0x4 – 啟用鍵盤控制 (SAK, unraw) (打開(kāi))
- 8 = 0x8 – 啟用進(jìn)程調(diào)試轉(zhuǎn)儲(chǔ)(debugging dumps of processes)等。(關(guān)閉)
- 16 = 0x10 – 啟用 sync 命令(打開(kāi))
- 32 = 0x20 – 啟用只讀重新掛載(打開(kāi))
- 64 = 0x40 – 啟用進(jìn)程信號(hào) (term, kill, oom-kill) (關(guān)閉)
- 128 = 0x80 – 允許重啟、關(guān)閉電源(打開(kāi))
- 256 = 0x100 – 允許調(diào)整所有 RT(實(shí)時(shí)) 任務(wù)優(yōu)先級(jí)(打開(kāi))