$ uptime 显示开机至今的时间 用户数 及平均负载
进程列表(process status)
$ ps
$ ps -efl System V 风格
F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD
$ ps aux BSD风格
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
$ top 显示前几名消耗资源的进程
一个简化的top版本-----simple-top
#!/bin/sh -
#持续执行ps命令
#每次显示之间,只作短时间的暂停
#语法:
# simple-top
IFS='
'
#自订PATH,以先取得BSD式的ps
PATH=/usr/ucb:/usr/bin:/bin
export PATH
HEADFLAGS="-n 20"
PSFLAGS=aux
SLEEPFLAGS=5
SORTFLAGS='-k3nr'
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
一个脚本显示系统是用者 以及属于他们的进程
#!/bin/sh -
#显示用户,及其活动中的进程数与进程名称
#可选择性地限制显示某些特定用户
#语法:
# puser [ user1 user2 ... ]
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 |
EGREP_OPTIONS= egrep "$EGREPFLAGS" |
sort -b -k1,1 -k2,2 |
uniq -c |
sort -b -k2,2 -k1nr,1 -k3,3 |
awk '{
user = ( LAST == $2) ? " " : $2
LAST = $2
printf("%-15s\t%2d\t%s\n", user, $1, $3)
}'
进程控制与删除
$ kill -l 列出支持的信号名称
$ kill -STOP PID 终止进程ID为PID的进程(暂停)
$ sleep 36000 && kill -CONT PID & 十小时后恢复
删除进程
ABRT(中断) 快速离开,不清除,而是产生进程内存影像的副本,将其置于核心
HUP(搁置) 要求终止,通常表示进程应向停止现在正在作的事,然后处理新的工作
KILL KILL和STOP信号会立即被传送,让进程立即中止
TERM(终结) 快速地清除并离开
一般而言,应先将HUP信号传送给进程,让其可以正常中止,若没有效果,可以使用TERM信号,若仍然没有办法停止,可以使用KILL。(KILL为非正常中止,会在文件系统里留下残余数据)
捕捉进程信号
trap可引起Shell注册信号处理器抓取制定的信号。
trap 字符串参数(捕捉时要被执行的命令列表) 捕捉的信号列表
一个脚本:休眠循环脚本
#!/bin/sh -
trap 'echo Ignoring HUP ...' HUP
trap 'echo Terminating on USR1 ...;exit 1' USR1
while true
do
sleep 2
date >/dev/null
done
$ ./looper & 后台执行looper
[1] 11985
$ kill -HUP 11985 HUP信号
Ignoring HUP ...
$ kill -USR1 11985 USR1信号
Terminating on USR1 ...
[1] Exit 1 ./looper
trap '...' EXIT exit()被系统调用前,作清理操作(如删除暂时性文件)