Links

17. 系统与管理命令

/etc/rc.d目录下的启动和关闭脚本演示了这些命令的大多数用法(和有用性)。这些通常由root用户调用,用于系统维护以及紧急文件系统修复。请谨慎使用,因为如果使用不当,其中一些命令可能会损坏您的系统。

用户和用户组

users

显示所有已经登录的用户。大致相当与who -q

groups

列出当前用户及其所属的组。该命令对应于$GROUPS内部变量,但是仅仅给出了组名,没有组号。
bash$ groups
bozita cdrom cdwriter audio xgrp
bash$ echo $GROUPS
501

chown, chgrp

chown命令用于更改一个或多个文件的所有权。这个命令非常有用,root用户可以使用它将文件所有权从一个用户转移到另一个用户。普通用户不能改变文件的所有权,即使是她自己的文件。[1]
root# chown bozo *.txt
chgrp命令用于更改一个或多个文件的用户组所有权。若想成功执行这个操作,你必须是该文件的所有者以及目标用户组(或root组)的成员。
chgrp --recursive dunderheads *.data
# "dunderheads"用户组现在拥有了所有"*.data"文件的权限。
# "*.data"一路从$PWD目录向下检索(这就是所谓的"recursive")。

useradd, userdel

useradd管理命令将用户帐户添加到系统中,并为该特定用户创建主目录(如果指定了主目录)。相应的,userdel命令从系统[2]中删除一个用户帐户,并删除相关的文件。
note
adduser命令是useradd的同义词,通常就是指向它的符号链接。

usermod

修改用户帐户。可以对给定用户帐户的密码、用户组、到期日期和其他属性进行更改。当使用此命令时,用户的密码可能会被锁定,因此具有禁用帐户的效果。

groupmod

修改给定的组。可使用此命令更改用户组名和/或ID号。

id

id命令列出了与当前进程相关联的真实有效的用户id和用户的组id。这是内部Bash变量$UID$EUID$GROUPS的对应副本。
bash$ id
uid=501(bozo) gid=501(bozo) groups=501(bozo),22(cdrom),80(cdwriter),81(audio)
bash$ echo $UID
501
note
id命令仅在有效id与真实id不同时才显示它们。
另请参阅样例 9-5

lid

lid(list ID)命令显示给定用户所属的用户组,或者属于给定用户组的用户。该命令只能由root用户调用。
root# lid bozo
bozo(gid=500)
root# lid daemon
bin(gid=1)
daemon(gid=2)
adm(gid=4)
lp(gid=7)

who

显示所有已登录系统的用户。
bash$ who
bozo tty1 Apr 27 17:45
bozo pts/0 Apr 27 17:46
bozo pts/1 Apr 27 17:47
bozo pts/2 Apr 27 17:49
-m选项仅给出当前用户的详细信息。向who传递任意另外两个参数与who -m等价,即who am i以及who The Man
bash$ who -m
localhost.localdomain!bozo pts/2 Apr 27 17:49
whoami命令类似于who -m,但仅列出用户名。
bash$ whoami
bozo

w

显示所有已登录的用户和属于他们的进程。这是who的扩展版本。w的输出可以管道传输给grep来找到特定的用户和/或进程
bash$ w | grep startx
bozo tty1 - 4:22pm 6:41 4.47s 0.45s startx

logname

显示当前用户的登录名(你也可以在/var/run/utmp下找到)。它近似于以上所说的whoami
bash$ logname
bozo
bash$ whoami
bozo
然而 ...
bash$ su
Password: ......
bash# whoami
root
bash# logname
bozo
note
尽管logname打印出了已经登录的用户名,但是whoami给出运行当前进程的用户名。正如我们刚刚看到的,有时这些执行结果并不相同。

su

作为另一个用户来运行这个程序或脚本。su rjones会作为rjones来开启一个shell。不带任何参数执行su默认切换到root用户。请参阅样例 A-14

sudo

作为root(或其他)用户运行一条命令。这可以运用在脚本中,从而允许普通用户来运行脚本中的命令。
#!/bin/bash
# 一些命令。
sudo cp /root/secretfile /home/bozo/secret
# 其他更多命令。
文件/etc/sudoers中记有所有允许调用sudo的用户名称。

passwd

设置、改变或者管理一个用户的密码。 passwd命令可以在脚本中使用,但是不推荐使用。
样例 17-1. 设置一个新密码
#!/bin/bash
# setnew-password.sh: 该脚本仅用于演示。
# 实际运行这个脚本并不是一个好主意。
# 该脚本必须以root用户运行。
ROOT_UID=0 # Root用户的$UID为0.
E_WRONG_USER=65 # 不是root用户?
E_NOSUCHUSER=70
SUCCESS=0
if [ "$UID" -ne "$ROOT_UID" ]
then
echo; echo "Only root can run this script."; echo
exit $E_WRONG_USER
else
echo
echo "You should know better than to run this script, root."
echo "Even root users get the blues... "
echo
fi
username=bozo
NEWPASSWORD=security_violation
# 检查bozo用户是否存在。
grep -q "$username" /etc/passwd
if [ $? -ne $SUCCESS ]
then
echo "User $username does not exist."
echo "No password changed."
exit $E_NOSUCHUSER
fi
echo "$NEWPASSWORD" | passwd --stdin "$username"
# 给予'passwd'命令'--stdin'选项
# 可以使其从标准输入(stdin)(或管道)中得到新密码。
echo; echo "User $username's password changed!"
# 在脚本中使用'passwd'命令市非常危险的。
exit 0
passwd命令的-l-u-d选项分别可以冻结、解锁以及删除用户的密码。只有root用户可以使用这些选项。

ac

显示从/var/log/wtmp中读取的用户登录时间。这是GNU会计实用工具之一。
bash$ ac
total 68.08

last

/var/log/wtmp中读取并列出最后登录的用户。这条命令也能够显示远程登陆的用户。 例如,显示最近几次系统重新启动的信息:
bash$ last reboot
reboot system boot 2.6.9-1.667 Fri Feb 4 18:18 (00:02)
reboot system boot 2.6.9-1.667 Fri Feb 4 15:20 (01:27)
reboot system boot 2.6.9-1.667 Fri Feb 4 12:56 (00:49)
reboot system boot 2.6.9-1.667 Thu Feb 3 21:08 (02:17)
. . .
wtmp begins Tue Feb 1 12:50:09 2005

newgrp

在不登出的情况下改变用户的组ID。这允许用户可以访问新组里的文件。由于用户可能同时是多个组的成员,因此该命令用途有限。
note
Kurt Glaesemann指出,newgrp命令可能有助于设置用户写入文件的默认组权限。但是仅仅为此目的,chgrp命令可能更为方便。

终端命令

tty

输出当前用户终端的名称 (文件名)。请注意,每个单独的xterm窗口都算作不同的终端。
bash$ tty
/dev/pts/1

stty

显示和/或更改终端设置。脚本中如果使用该复杂的命令可以控制终端行为和输出显示方式。请参阅info手册,并开展仔细的研究。
样例 17-2. 设置一个擦除字符
#!/bin/bash
# erase.sh: 当读取输入时,使用"stty"来设置一个擦除字符。
echo -n "What is your name? "
read name # 请尝试回车
# 来删除输入的字符
# 发现问题了吗?
echo "Your name is $name."
stty erase '#' # 设置"井号"(#)作为擦除字符。
echo -n "What is your name? "
read name # 尝试使用井号来删除最后一个输入的字符。
echo "Your name is $name."
exit 0
# 即便脚本已经执行结束,这个新的键值设置仍然有效。
# 练习:要怎样才能把擦除字符重置默认值呢?
样例 17-3. 秘密的密码:关闭终端输入显示
#!/bin/bash
# secret-pw.sh: 秘密的密码
echo
echo -n "Enter password "
read passwd
echo "password is $passwd"
echo -n "If someone had been looking over your shoulder, "
echo "your password would have been compromised."
echo && echo # 在一个&列表中输出两个换行符。
stty -echo # 关闭屏幕输出。
# 也可以使用以下命令实现相同效果:
# read -sp passwd
# 非常感谢Leigh James指出。
echo -n "Enter password again "
read passwd
echo
echo "password is $passwd"
echo
stty echo # 恢复屏幕输出。
exit 0
# 请执行'info stty'以了解这个有用但棘手的命令。
stty的一种创造性用途是检测用户按键 (不键入回车键)。
样例 17-4. 检测按键
#!/bin/bash
# keypress.sh: 检测用户按键 (“热键”)。
echo
old_tty_settings=$(stty -g) # 保存原有设置(为什么?)。
stty -icanon
Keypress=$(head -c1) # 或者在非GNU系统上使用
# $(dd bs=1 count=1 2> /dev/null)
echo
echo "Key pressed was \""$Keypress"\"."
echo
stty "$old_tty_settings" # 恢复原有设置。
# 感谢Stephane Chazelas。
exit 0
另请参阅样例 9-3样例 A-43

终端和模式

通常,终端以规范模式工作。当用户击中某个键时,生成的字符不会立即转到该终端中实际运行的程序。终端本地的缓冲区会对用户的击键(keystroke)进行缓存。当用户敲击回车键时,才会将所有存储的击键(keystroke)发送给正在运行的程序。终端内部甚至有一个基本的行编辑器(line editor)。
bash$ stty -a
speed 9600 baud; rows 36; columns 96; line = 0;
intr = ^C; quit = ^\; erase = ^H; kill = ^U; eof = ^D; eol = <undef>; eol2 = <undef>;
start = ^Q; stop = ^S; susp = ^Z; rprnt = ^R; werase = ^W; lnext = ^V; flush = ^O;
...
isig icanon iexten echo echoe echok -echonl -noflsh -xcase -tostop -echoprt
使用规范模式,可以重新定义本地终端线路编辑器的特殊键。
bash$ cat > filexxx
wha<ctl-W>I<ctl-H>foo bar<ctl-U>hello world<ENTER>
<ctl-D>
bash$ cat filexxx
hello world
bash$ wc -c < filexxx
12
尽管用户按了26个键,但控制终端的进程仅接收12个字符 (11个字母字符,加上1个换行符)。
在非规范 (“raw”) 模式下,每个击键 (包括特殊的编辑键,例如ctl-H) 都会立即向控制过程发送一个字符。
Bash提示符禁用了icanonecho,因为它用自己更精细的编辑器代替了基本的终端行编辑器。例如,当你在Bash提示符中键入ctl-A,在终端上并没有输出^A
,但是Bash得到了一个**\1**字符并翻译,将光标从行首向前移动一位。
Stéphane Chazelas

setterm

设置某些终端属性。此命令将更改写入终端标准输出(stdout)的字符串行为。
bash$ setterm -cursor off
bash$
setterm命令可以在脚本中更改写入标准输出(stdout)的文本的外观,尽管肯定有更好的工具可实现此目的。
setterm -bold on
echo bold hello
setterm -bold off
echo normal hello

tset

显示或者初始化终端设置。这是一个能力不强的stty版本。
bash$ tset -r
Terminal type is xterm-xfree86.
Kill is control-U (^U).
Interrupt is control-C (^C).

setserial

设置或显示串行端口参数。此命令必须由root用户运行,通常可以在系统设置脚本中找到。
# 选自/etc/pcmcia/serial脚本:
IRQ=`setserial /dev/$DEVICE | sed -e 's/.*IRQ: //'`
setserial /dev/$DEVICE irq 0 ; setserial /dev/$DEVICE irq $IRQ

getty, agetty

gettyagetty是终端初始化进程,并设置用户登录窗口。这些命令不在用户shell脚本中使用。他们脚本对应的命令是stty

mesg

允许或者禁用当前用户终端的写权限。禁用权限可以防止网络上的另一个用户将内容写入这个终端。
note
设想一下,当你正在专心致志地编辑文本文件时突然跳出一条外卖广告是多么烦人。因此,在多用户网络中,当需要避免中断时,你或许希望禁用对终端的写访问。

wall

这是“全部写入”的首字母缩写,即向当前网络中每个终端的所有用户发送消息。这主要是一个系统管理员的工具,很有用,例如,当警告每个人系统将由于一个问题而即将关闭时(参见样例 19-1)。
bash$ wall System going down for maintenance in 5 minutes!
Broadcast message from bozo (pts/1) Sun Jul 8 13:53:27 2001...
System going down for maintenance in 5 minutes!
note
如果一个特定的终端已经被mesg禁用了写权限,那么wall将不能向那个终端发送信息。

信息和统计命令

uname

该命令将系统参数(操作系统、内核版本等)输出到标准输出(stdout)。当使用-a参数调用时,会给出详细的系统信息(参见样例 16-5)。-s参数仅显示操作系统类型。
bash$ uname
Linux
bash$ uname -s
Linux
bash$ uname -a
Linux iron.bozo 2.6.15-1.2054_FC5 #1 Tue Mar 14 15:48:33 EST 2006
i686 i686 i386 GNU/Linux

arch

显示系统架构。与uname -m等价。请参阅样例 11-27
bash$ arch
i686
bash$ uname -m
i686

lastcomm

给出存储在/var/account/pacct文件中之前执行过命令的信息。命令名和用户名可以由选项指定。这是GNU会计工具之一。

lastlog

列出所有系统用户最后一次的登陆时间。该命令参考/var/log/lastlog文件。
note
如果调用该命令的用户没有var/log/lastlog文件的读权限,那么将会失败。

lsof

列出所有已打开的文件。这条命令会以表格的形式详细输出当前所有打开的文件,并给出这些文件的拥有者、大小、与其关联的进程等等。当然,lsof可以通过管道传输给grepawk来解析和分析它的结果。
bash$ lsof
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
init 1 root mem REG 3,5 30748 30303 /sbin/init
init 1 root mem REG 3,5 73120 8069 /lib/ld-2.1.3.so
init 1 root mem REG 3,5 931668 8075 /lib/libc-2.1.3.so
cardmgr 213 root mem REG 3,5 36956 30357 /sbin/cardmgr
...
lsof命令是一条有用的,复杂的命令工具。如果你无法取消挂载一个文件系统并且仍得到“该文件系统仍在使用中”的报错消息,那么执行lsof会有助于查找究竟是哪个在文件系统上的文件还处于打开状态。-i选项会列出网络套接字(socket)文件,因此这可以帮助追踪入侵或者黑客攻击。
bash$ lsof -an -i tcp
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
firefox 2330 bozo 32u IPv4 9956 TCP 66.0.118.137:57596->67.112.7.104:http ...
firefox 2330 bozo 38u IPv4 10535 TCP 66.0.118.137:57708->216.79.48.24:http ...
请参阅样例 30-2了解lsof命令有效的使用方式。

strace

系统跟踪:用于跟踪系统调用和信号的调试诊断工具。该命令和下面的ltrace命令对于诊断给定程序或软件包无法运行的原因非常有用 . . . 可能是因为缺少库或相关原因。
bash$ strace df
execve("/bin/df", ["df"], [/* 45 vars */]) = 0
uname({sys="Linux", node="bozo.localdomain", ...}) = 0
brk(0) = 0x804f5e4
...
该条命令运行在Linux系统上,并且与Solaris系统上的truss命令等价。

ltrace

库跟踪:用于跟踪给定命令所调用的库调用操作的调试诊断工具。
bash$ ltrace df
__libc_start_main(0x804a910, 1, 0xbfb589a4, 0x804fb70, 0x804fb68 <unfinished ...>:
setlocale(6, "") = "en_US.UTF-8"
bindtextdomain("coreutils", "/usr/share/locale") = "/usr/share/locale"
textdomain("coreutils") = "coreutils"
__cxa_atexit(0x804b650, 0, 0, 0x8052bf0, 0xbfb58908) = 0
getenv("DF_BLOCK_SIZE") = NULL
...

nc

nc (netcat)实用程序是一个完整的工具包,用于连接和侦听TCP和UDP端口。它是一个有用的调试诊断工具,也是基于脚本的简单HTTP客户端及服务器中的一个组件。
bash$ nc localhost.localdomain 25
220 localhost.localdomain ESMTP Sendmail 8.13.1/8.13.1;
Thu, 31 Mar 2005 15:41:35 -0700
一个现实生活中的案例
样例 17-5. 检查远程服务器的ident
#! /bin/sh
## 用netcat复刻DaveG的“ident扫描”程序。哦我的上帝,他将被隔壁老奶奶的靴子狠狠地踢到屁股。
## 参数: 目标 端口 [端口 端口 端口 ...]
## 不区分标准输出(stdout)和标准错误(stderr)。
##
## 优点:运行速度比ident扫描慢,远程ident也产生了更少的报警信息,
## 并且仅命中你指定的几个已知守护程序端口。
## 缺点: 仅支持整型端口参数,输出困难。
## 并且当来自高源端口时,对于r服务不起作用。
# 脚本作者: Hobbit <[email protected]>
# 经许可在本书中使用。
# ---------------------------------------------------
E_BADARGS=65 # 需要至少两个参数。
TWO_WINKS=2 # 等待多长时间。
THREE_WINKS=3
IDPORT=113 # 身份验证 “tap ident” 端口。
RAND1=999
RAND2=31337
TIMEOUT0=9
TIMEOUT1=8
TIMEOUT2=4
# ---------------------------------------------------
case "${2}" in
"" ) echo "Need HOST and at least one PORT." ; exit $E_BADARGS ;;
esac
# Ping他们一次,看看他们 *是否* 正在运行identd。
nc -z -w $TIMEOUT0 "$1" $IDPORT || \
{ echo "Oops, $1 isn't running identd." ; exit 0 ; }
# -z 参数扫描监听的守护程序。
# -w $TIMEOUT = 尝试连接的等待时间。
# 生成一个随机的基本端口。
RP=`expr $$ % $RAND1 + $RAND2`
TRG="$1"
shift
while test "$1" ; do
nc -v -w $TIMEOUT1 -p ${RP} "$TRG" ${1} < /dev/null > /dev/null &
PROC=$!
sleep $THREE_WINKS
echo "${1},${RP}" | nc -w $TIMEOUT2 -r "$TRG" $IDPORT 2>&1
sleep $TWO_WINKS
# 这看起来像一个接吻脚本或者其他的 . . . ?
# 本书作者评论说:“实际上并没有那么糟糕 . . .
# 反而有点聪明”
kill -HUP $PROC
RP=`expr ${RP} + 1`
shift
done
exit $?
# 注记:
# -----
# 请尝试注释掉第30行,并以"localhost.localdomain 25"
# 为参数运行此脚本。
# 有关Hobbit更多的'nc'样例脚本,
# 请参阅文档:
# 位于/usr/share/doc/nc-X.XX/scripts目录下。
当然,在BitKeeper事件中还有Andrew Tridgell博士臭名昭著的单行脚本:
echo clone | nc thunk.org 5000 > e2fsprogs.dat

free

以表格形式显示内存和缓存使用情况。此命令的输出可以使用grepawkPerl进行解析。procinfo命令不仅显示free输出的所有信息,而且包括更多信息。
bash$ free
total used free shared buffers cached
Mem: 30504 28624 1880 15820 1608 16376
-/+ buffers/cache: 10640 19864
Swap: 68540 3128 65412
显示未用的RAM内存:
bash$ free | grep Mem | awk '{ print $4 }'
1880

procinfo

/proc伪文件系统中提取并列出信息和统计信息。该命令给出了一个非常广泛和详细的列表。
bash$ procinfo | grep Bootup
Bootup: Wed Mar 21 15:15:50 2001 Load average: 0.04 0.21 0.34 3/47 6829

lsdev

列出设备,即显示已安装的硬件。
bash$ lsdev
Device DMA IRQ I/O Ports
------------------------------------------------
cascade 4 2
dma 0080-008f
dma1 0000-001f
dma2 00c0-00df
fpu 00f0-00ff
ide0 14 01f0-01f7 03f6-03f6
...

du

递归显示 (磁盘) 文件使用情况。默认为当前工作目录,除非另有说明。
bash$ du -ach
1.0k ./wi.sh
1.0k ./tst.sh
1.0k ./random.file
6.0k .
6.0k total

df

以表格形式显示文件系统使用情况。
bash$ df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/hda5 273262 92607 166547 36% /
/dev/hda8 222525 123951 87085 59% /home
/dev/hda7 1408796 1075744 261488 80% /usr

dmesg

将系统启动消息写入标准输出(stdout)。方便调试和确定安装了哪些设备驱动程序以及正在使用哪些系统中断。当然,dmesg的输出可以在脚本中使用grepsedawk进行解析。
bash$ dmesg | grep hda
Kernel command line: ro root=/dev/hda2
hda: IBM-DLGA-23080, ATA DISK drive
hda: 6015744 sectors (3080 MB) w/96KiB Cache, CHS=746/128/63
hda: hda1 hda2 hda3 < hda5 hda6 hda7 > hda4

stat

给出指定文件 (甚至是目录或设备文件) 或文件集详细全面的统计信息
bash$ stat test.cru
File: "test.cru"
Size: 49970 Allocated Blocks: 100 Filetype: Regular File
Mode: (0664/-rw-rw-r--) Uid: ( 501/ bozo) Gid: ( 501/ bozo)
Device: 3,8 Inode: 18185 Links: 1
Access: Sat Jun 2 16:40:24 2001
Modify: Sat Jun 2 16:40:24 2001
Change: Sat Jun 2 16:40:24 2001
如果目标文件不存在,stat会返回错误信息。
bash$ stat nonexistent-file
nonexistent-file: No such file or directory
在脚本中,你可以使用stat提取有关文件 (和文件系统) 的信息,并相应地设置变量。
#!/bin/bash
# fileinfo2.sh
# 采取来自Joël Bourquard 以及 . . .
# http://www.linuxquestions.org/questions/showthread.php?t=410766
# 等建议。
/www.linuxquestions.org/questions/
FILENAME=testfile.txt
file_name=$(stat -c%n "$FILENAME") # 当然,等效于"$FILENAME"。
file_owner=$(stat -c%U "$FILENAME")
file_size=$(stat -c%s "$FILENAME")
# 当然,使用"ls -l $FILENAME"
# 再用sed解析要方便地多。
file_inode=$(stat -c%i "$FILENAME")
file_type=$(stat -c%F "$FILENAME")
file_access_rights=$(stat -c%A "$FILENAME")
echo "File name: $file_name"
echo "File owner: $file_owner"
echo "File size: $file_size"
echo "File inode: $file_inode"
echo "File type: $file_type"
echo "File access rights: $file_access_rights"
exit 0
sh fileinfo2.sh
File name: testfile.txt
File owner: bozo
File size: 418
File inode: 1730378
File type: regular file
File access rights: -rw-rw-r--

vmstat

展示虚拟内存统计数据。
bash$ vmstat
procs memory swap io system cpu
r b w swpd free buff cache si so bi bo in cs us sy id
0 0 0 0 11040 2636 38952 0 0 33 7 271 88 8 3 89

uptime

显示系统运行了多长时间,以及相关的统计信息。
bash$ uptime
10:28pm up 1:57, 3 users, load average: 0.17, 0.34, 0.27
note
负载均值为1或更小表示系统将会立即处理进程。负载平均值大于1意味着进程正在排队。当负载平均值高于3 (在单核处理器上) 时,系统性能会大大降低。

hostname

列出当前系统的主机名。该命令会在/etc/rc.d/etc/rc.d/rc.sysinit或类似的文件)中设置主机名。该命令与uname -n等效,并且是内部变量$HOSTNAME的对应项。
bash$ hostname
localhost.localdomain
bash$ echo $HOSTNAME
localhost.localdomain
hostname类似的命令还有domainnamednsdomainnamenisdomainnameypdomainname命令。可以使用这些命令来显示或设置系统DNS或NIS/YP域名。hostname命令的各种选项也实现了这些功能。

hostid

输出主机的32位十六进制数字标识符。
bash$ hostid
7f0100
note
据称,该命令获取了特定系统的 “唯一” 序列号。某些产品注册程序使用此编号来标记特定的用户许可证。不幸的是,hostid仅返回十六进制机器网络地址,并对字节进行了转置。
/etc/hosts文件中可以找到典型的非联网Linux主机的网络地址。
bash$ cat /etc/hosts
127.0.0.1 localhost.localdomain localhost
碰巧的是,如果转置127.0.0.1的字节,我们会得到0.127.1.0,转换为十六进制为007f0100,完全等同于上面的hostid返回的内容。在全世界,只有几百万台其他Linux机器具有相同的hostid

sar

sar命令(系统活动报告者) 提供了极详细的系统统计信息摘要。圣克鲁斯行动 (“旧” SCO) 在1999年6月将sar作为开源软件发布。
此命令不是基本Linux发行版的一部分,但可以从Sebastien Godard编写的sysstat实用程序包中获得。
bash$ sar
Linux 2.4.9 (brooks.seringas.fr) 09/26/03
10:30:00 CPU %user %nice %system %iowait %idle
10:40:00 all 2.21 10.90 65.48 0.00 21.41
10:50:00 all 3.36 0.00 72.36 0.00 24.28
11:00:00 all 1.12 0.00 80.77 0.00 18.11
Average: all 2.23 3.63 72.87 0.00 21.27
14:32:30 LINUX RESTART
15:00:00 CPU %user %nice %system %iowait %idle
15:10:00 all 8.59 2.40 17.47 0.00 71.54
15:20:00 all 4.07 1.00 11.95 0.00 82.98
15:30:00 all 0.79 2.94 7.56 0.00 88.71
Average: all 6.33 1.70 14.71 0.00 77.26

readelf

显示指定elf二进制文件的信息和统计信息。该命令是binutils包的一部分。
bash$ readelf -h /bin/bash
ELF Header:
Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00
Class: ELF32
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
. . .

size

size [/path/to/binary]命令给出二进制可执行文件或存档文件的段大小。这主要对程序员有用。
bash$ size /bin/bash
text data bss dec hex filename
495971 22496 17392 535859 82d33 /bin/bash

系统日志命令

logger

将用户生成的消息附加到系统日志 (/var/log/messages)。您不必是root用户即可调用logger
logger Experiencing instability in network connection at 23:10, 05/21.
# 现在,执行一下'tail /var/log/messages'。
通过在脚本中嵌入logger命令,可以将调试信息写入/var/log/messages
logger -t $0 -i Logging at line "$LINENO".
# "-t"选项指定logger条目的标记。
# "-i"选项会记录进程ID。
# tail /var/log/message
# ...
# Jul 7 20:48:58 localhost ./test.sh[1712]: Logging at line 3.

logrotate

此实用程序(日志轮转)管理系统日志文件,根据需要轮转、压缩、删除和/或通过电子邮件发送它们。这样可以防止/var/log被旧的日志文件弄得乱七八糟。通常cron程序每天会运行logrotate
/etc/logrotate.conf中添加适当的条目可以管理个人日志文件以及系统范围的日志文件。
note
Stefano Falsetto开发了[rottlog](GNU Rot[t]log),他认为这是logrotate的改进版本。

任务控制命令

ps

进程统计:按所有者和PID (进程ID) 列出当前正在执行的进程。该命令经常带有axaux选项进行调用,并且可以管道传输到grepsed来搜索特定的进程(参阅样例 15-14样例 29-3)。
bash$ ps ax | grep sendmail
295 ? S 0:00 sendmail: accepting connections on port 25
以图形化进程 “树” 格式显示系统进程:请执行ps afjxps ax -- forest

pgrep, pkill

ps命令与grepkill结合了起来。
bash$ ps a | grep mingetty
2212 tty2 Ss+ 0:00 /sbin/mingetty tty2
2213 tty3 Ss+ 0:00 /sbin/mingetty tty3
2214 tty4 Ss+ 0:00 /sbin/mingetty tty4
2215 tty5 Ss+ 0:00 /sbin/mingetty tty5
2216 tty6 Ss+ 0:00 /sbin/mingetty tty6
4849 pts/2 S+ 0:00 grep mingetty
bash$ pgrep mingetty
2212 mingetty
2213 mingetty
2214 mingetty
2215 mingetty
2216 mingetty
请比较pkillkillall命令的行为。