第十三章进程
进程是一个执行中程序的一个实例,新进程由fork()与execve()等系统调用所起始执行直到exit()为止。进程会被指定优先权,nice和renice命令用于调整进程的优先权。任何瞬间,等待执行之进程的平均数,被成为平均负载,uptime命令可显示。
列出进程状态的命令是ps(process status)。System V形式下:ps -efl显示更多信息,BSD形式是ps aux 。进程列表是动态的,如果想观察动态的,可以使用top命令。
shell程序处理下一个命令之前会等待前一条命令结束,但是在命令最后加入&可以使其在后台运行,便可不用等待上一个命令了。wait命令可以用来等待某个特定进程完成,在不加任何参数情况下,则为等待所有后台进程完成。另外控制的还有bg、fg、jobs等都处理目前shell下所建立的执行中的进程。
有4组键盘字符可用以中断前台进程,这些字符可通过stty命令选项而设置。一般是Ctrl-C(intr:杀除)、Ctrl-Y(dsusp:暂时搁置,直到输入更新为止)、Ctrl-Z(susp:暂时搁置),与Ctrl-(quit:以核心存储方式杀除)。
用上边的几个命令实现一个简单的top命令:
#! /bin/sh -
# 持续执行ps命令,每次显示之间,只作短时间的暂停
#
# 语法:
# simple-top
IFS='
'
#自定PATH,以先取得BSD式的ps
PATH=/usr/ucb:/usr/bin:/bin
export PATH
HEADFLAGS="-n 20"
PSFLAGS=aux
SLEEPFLAGS=2
SORTFLAGS='-k3nr -k1,1 -k2n'
HEADER="`ps $PSFLAGS | head -n 1 `"
while true
do
clear
uptime
echo "$HEADER"
ps $PSFLAGS | sed -e 1d | sort $SORTFLAGS | head $HEADFLAGS
sleep $SLEEPFLAGS
done
再实现一个针对user查询的脚本:
#! /bin/sh -
# 显示用户及其活动中的进程数和进程名称
# 可选择性限制显示某些特定用户
# 语法:
# puser [ user1 ... ]
IFS='
'
PATH=/usr/local/bin:/usr/bin:/bin
export PATH
EGREPFLAGS=
while test $# -gt 0
do
if test -z "$EGREPFLAGS"
then
EGREPFLAGS="$1"
else
EGREPFLAGS="$EGREPFLAGS|$1"
fi
shift
done
if test -z "$EGREPFLAGS"
then
EGREPFLAGS="."
else
EGREPFLAGS="^ *($EGREPFLAGS) "
fi
case "`uname -s`" in
*BSD | Darwin ) PSFLAGS="-a -e -o user,ucomm -x" ;;
* ) PSFLAGS="-e -o user,comm" ;;
esac
ps $PSFLAGS | sed -e 1d |










