您好,登錄后才能下訂單哦!
ps:顯示系統當前進程狀態的命令
ps a 所有與終端相關的進程
ps x 所有與終端無關的進程
ps u 以用戶為中心顯示進程相關信息
VSZ:
虛擬內存集,Virutal menmory Size
RSS:
常駐內存集
STAT:
R:運行或可運行
S:可中斷睡眠
D:不可中斷睡眠
T:停止
Z:僵死
s:session leader 有子進程
+:前臺進程
l:多線程進程
N:低優先級進程
<: 高優先級進程
START:
啟動時間
TIME:
累計占用的內存時間
COMMAND
[]表示內核線程
ps [option]
-e 顯示所有進程
-f 以進程的長格式顯示
-F 顯示額外信息
-H 顯示進程的層次信息
-o 自定義要顯示的信息
ps axo pid,command
ps aux 常用組合
ps -ef 常用組合
ps -eFH 常用組合
pstree:顯示進程樹
pgrep:
-U Username 僅顯示指定用戶的進程的進程的PID
-G Groupname 僅顯示指定用戶組的進程的進程的PID
pidof:顯示指定命令所啟動的pid
pidof command
top:
top - 10:35:59 up 2 days, 16:26, 3 users, load average: 0.00, 0.00, 0.00
系統當前時間 系統運行時長 登錄的用戶 平均負載:1分鐘,五分鐘,15分鐘
Tasks: 110 total, 1 running, 109 sleeping, 0 stopped, 0 zombie
總進程數 運行進程數 休眠進程數 停止進程數 僵死進程數
Cpu(s): 0.0%us, 0.1%sy, 0.0%ni, 99.8%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
用戶空間占比 系統占比 nice占比 空閑占比 等待占比 硬中斷占比 軟中斷占比 被占用占比
Mem: 1918400k total, 406832k used, 1511568k free, 153868k buffers
Swap: 2097144k total, 0k used, 2097144k free, 90524k cached
M: 按內存占用百分比大小排序
P:按cpu占用百分比大小排序,默認
T:按累計占有時長進行排序
1:多CPU時按數字1可以分開顯示
l: 是否顯示負載信息
t:是否顯示cpu和進程的統計信息
m:是否顯示內存和交互分區的信息
q:退出
k:kill,殺掉進程
s:改變top刷新頻率
常用選項:
-d # :指定刷新時間間隔
-n # :指定刷新的次數
-b :以批次顯示top的刷新
htop
u:選擇指定用戶的進程
l: 顯示進程所打開的文件列表
s:顯示進程執行的系統調用
a:顯示進程的進程的cpu上
#:快速將光標定位之指定的PID進程上
quit
vmstst
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
r b swpd free buff cache si so bi bo in cs us sy id wa st
0 0 0 57460 54564 285520 0 0 30 5 21 14 0 0 99 1
procs
r:運行或等待cpu時間片的進程的個數
b:被阻塞(通常為等待I/O完成)的進程的長度
memory
swpd:從物理內存交互至swap中的數據量
free:未使用的內存大小
buffer:buffer空間大小,通常與緩存寫操作相關
cache:cache空間大小,通常與緩存讀操作相關
swap
si:swap in 數據進入swap中的數據量,通常是速率。kb/s
so:swap out 數據離開swap中的數據量,通常是速率。kb/s
io:
bi:block in:從塊設備讀入的數據量,通常是速率,kb/s
bo:block out:保存至塊設備中的數據量,通常是速率,kb/s
in:中斷發生頻率。每秒的中斷數
cs:context switch 上下文切換,進程切換,通常是速率,kb/s
cpu:
us:用戶空間的使用率
sy:內核空間的使用率
id:空閑
wa:等待的
st:被偷走的
使用格式
vmstat [delay [counts]]
-s:顯示內存統計數據
nice,renice
進程:nice
用來手動調整進程優先級,默認nice為0.其默認優先級為120
nice值取值范圍 :-20,19
nice值對應優先級 :100,139
nice:普通用戶只能調大此值
對于尚未啟動的程序
nice -n # COMMAND 進程以#的nice值啟動
對于運行中的進程:
renice # PID 調整指定PID的nice值
ps axo ni command pid 查看進程的nice值
進程間通信(IPC):
信號:
kill命令:可以實現向其他進程發送信息
kill -l 或 man 7 signal 可以查看可以向進程發送的所有信息
kill -SIGNAL PID 殺死指定進程(SINGAL可以使數字代號也可以是信號名稱)
1) SIGHUP 讓程序重讀配置文件,而不用重啟程序
2) SIGINT 中斷信號。Ctrl+c即發送此信號
9) SIGKILL 殺死進程
15) SIGTERM 終止進程,比較優雅(默認)
killall -SIGNAL 進程名 殺死指定程序的所有進程
Linux的作業控制
前臺作業:占據著一個終端
后臺作業:作業執行時不占據終端,作業啟動后就釋放終端
非守護進程類的程序,啟動以后都在前臺工作
如果已經啟動:前臺-->后臺。ctrl+z把前臺作業送往后臺,作業被”停止“
如果尚未啟動:COMMAND &
退出當前會話,作業也會終止,因為作業與當前終端相關,如果把作業送往后臺后,不期望作業隨終止結束而停止
nohup COMMAND &
如何讓送往后臺的作業繼續執行:
fg [[%]作業號碼]:將作業調回前臺繼續進行
bg [[%]作業號碼]:讓作業在后臺繼續進行
默認的為最后一個進入后臺的任務
kill %作業號碼:終止作業
查看作業號:
jobs
pmap pid 查看進程的內存占用情況
00007fb60640d000 4K rw--- /sbin/init
起始地址 空間 權限
bash腳本編程:之case語句
case語句的語法格式:
case expression in
pattern1)
suite1
;;
pattern2)
suite2
;;
...
patternn)
suiten
;;
*)
other_suite
;;
esac
case中各pattern可以使用模式:
a|b a或者b
* 匹配任意長度的任意字符;
? 匹配任意單個字符;
[-] 范圍匹配
練習:寫一個腳本,接受如此格式
script.sh {start|stop|restart|status}
1、如是start,那么創建/var/lock/subsys/script.sh,顯示啟動成功;
2、如果參數是stop,則刪除/var/lock/subsys/script.sh,顯示停止成功
3、如果restart,則刪除,再創建,顯示成功;
4、如果status, 如果文件存在,則顯示running,否則,顯示stopped
#!/bin/bash
#
myService=`basename $0`
lockFile="/var/lock/subsys/$myService"
[ $# -lt 1 ] && echo "Usage: $myService {start|stop|restart|status}" && exit 4
case $1 in
'start')
touch $lockFile
echo "Starting $myService OK"
;;
'stop')
rm -f $lockFile
echo "Stopping $myService OK"
;;
'restart')
rm -f $lockFile
touch $lockFile
echo "Restarting $myService OK"
;;
'status')
if [ -f $lockFile ]; then
echo "$myService is running"
else
echo "$myService is stopped"
fi
;;
*)
echo "Usage: $myService {start|stop|restart|status}"
exit 3
;;
esac
練習:寫一個腳本,能對/etc/目錄進行打包備份,備份位置為/backup/etc-日期.后綴
1、顯示如下菜單給用戶:
xz) xz compress
gzip) gzip compress
bip2) bzip2 compress
2、根據用戶指定的壓縮工具使用tar打包壓縮;
3、默認為xz;輸入錯誤則需要用戶重新輸入;
#!/bin/bash
#
[ -d /backup ] || mkdir /backup
cat << EOF
Plz choose a compress tool:
xz) xz compress
gzip) gzip compress
bip2) bzip2 compress
EOF
while true; do
read -p "Your option: " option
option=${option:-xz}
case $option in
xz)
compressTool='J'
suffix='xz'
break ;;
gzip)
compressTool='z'
suffix='gz'
break ;;
bzip2)
compressTool='j'
suffix='bz2'
break ;;
*)
echo "wrong option." ;;
esac
done
tar ${compressTool}cf /backup/etc-`date +%F-%H-%M-%S`.tar.$suffix /etc/*
練習:寫一個腳本,完成如下功能
說明:此腳本能夠為指定網卡創建別名,指定地址;使用格式:mkethalias.sh -v|--verbose -i|--interface ethX
1、-i選項用于指定網卡;
2、如果網卡存在:在命令行,請用戶指定一個別名;
3、讓用戶指定IP和掩碼;
4、用戶可以同時使用-v或--verbose選項:如果使用了,則在配置完成后,顯示配置結果;否則,則不予顯示;
#!/bin/bash
#
debug=0
while [ $# -ge 1 ]; do
case $1 in
-i|--interface)
ethcard="$2"
shift 2 ;;
-v|--verbose)
debug=1
shift
;;
*)
echo "Wrong options or arguments."
echo "Usage: `basename $0` [-v|--verbose] -i|--interface Interface"
shift $#
;;
esac
done
# echo "Interface: $ethcard , Verbose Flag: $debug "
! ifconfig $ethcard &> /dev/null && echo "No this interface..." && exit 3
read -p "Enter an alias: " ethAlias
read -p "Enter IP: " ipAddr
read -p "Mask: " netMask
ifconfig $ethAlias $ipAddr netmask $netMask
[ $debug -eq 1 ] && ifconfig $ethAlias
bash腳本編程之函數
可被調用:函數有函數名
函數出現的地方,會自動被替換成函數定義的代碼
函數定義
語法:
FuncName() {
函數體
}
function FuncName {
函數體
}
函數有兩種返回值:
正常返回的數據:
函數中的打印語句,如echo或print
函數中命令的執行結果
執行狀態返回值:
取決于函數中執行的最后一條語句
自定義:return N
函數可以接受參數:
在函數體可以使用類似腳本調用位置參數一樣的參數
$1, $2, ...
$#
$*, $@
練習:寫一個腳本,完成如下功能
1、顯示如下菜單
disk) show disk info
mem) show memory info
cpu) show cpuinfo
2、顯示用戶選定的內容;
#!/bin/bash
#
ShowMenu() {
cat << EOF
disk) show disk info
mem) show memory info
cpu) show cpuinfo
EOF
}
main() {
ShowMenu
read -p "Plz choose an option: " option
case $option in
disk)
df -h
;;
mem)
free -m
;;
cpu)
cat /proc/cpuinfo
;;
*)
echo "Wrong option"
esac
}
main
如果在函數中使用變量:變量作用域
在函數中使用了在主程序中聲明的變量,重新賦值會直接修改主程序中的變量;
如果不期望函數與主程序中的變量沖突,函數中使用變量都用local修飾;即使用局部變量;
在函數中使用了在主程序中沒有聲明的變量,在函數執行結束后即被撤消,無論是否使用local修飾符;
如果想把腳本的全部位置參數,統統傳遞給腳本中某函數使用,怎么辦?
使用$*傳遞
練習:寫一個腳本,判定172.16.0.0網絡內有哪些主機在線,在線的用綠色顯示,不在線的用紅色顯示;要求,編程中使用函數;
#!/bin/bash
Ping(){
ipAddr=172.16.$1.$2
ping -c 1 -w 1 $ipAddr >> /dev/null
if [ $? -eq 0 ];then
echo -e "\033[32m$ipAddr\033[0m"
else
echo -e "\033[31m$ipAddr\033[0m"
fi
}
for i in `seq 0 255`;do
for j in `seq 1 254`;do
Ping $i $j
done
done
練習:寫一個腳本,完成如下功能(使用函數):
1、提示用戶輸入一個可執行命令;
2、獲取這個命令所依賴的所有庫文件(使用ldd命令);
3、復制命令至/mnt/sysroot/對應的目錄中
解釋:假設,如果復制的是cat命令,其可執行程序的路徑是/bin/cat,那么就要將/bin/cat復制到/mnt/sysroot/bin/目錄中,如果復制的是useradd命令,而useradd的可執行文件路徑為/usr/sbin/useradd,那么就要將其復制到/mnt/sysroot/usr/sbin/目錄中;
4、復制各庫文件至/mnt/sysroot/對應的目錄中,其要求命令;
#!/bin/bash
#
target=/mnt/sysroot
clearCmd() {
if which $cmd &> /dev/null; then
cmdPath=`which --skip-alias $cmd`
else
echo "No such command"
return 5
fi
}
cmdCopy() {
cmdDir=`dirname $1`
[ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir}
[ -f ${target}${1} ] || cp $1 ${target}${cmdDir}
}
libCopy() {
for lib in `ldd $1 | grep -o "/[^[:space:]]\{1,\}"`; do
libDir=`dirname $lib`
[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
[ -f ${target}${lib} ] || cp $lib ${target}${libDir}
done
}
while true; do
read -p "Enter a command: " cmd
if [ "$cmd" == 'quit' ] ;then
echo "quit"
exit 0
fi
clearCmd $cmd
[ $? -eq 5 ] && continue
cmdCopy $cmdPath
libCopy $cmdPath
done
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。