shell脚本学习指南[五](Arnold Robbins & Nelson H.F. Beebe著)

2019-09-23 09:42:00王振洲

第十三章进程


进程是一个执行中程序的一个实例,新进程由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 |