程序和計劃任務管理
ps 程序管理工具
包含帶-的不帶-的選項
ps 檢視目前終端程序
ps a 檢視所有終端的程序
ps ax 檢視所有和終端無關的程序
ps axu 顯示程序的所有者
ps uxaf 檢視程序的父子關系
ps xo cmd,%CPU k %cpu 排序檢視cmd和CPU相應的列 按CPU排序
ps k %cpu 按CPU排序
ps L 檢視所有的屬性
renice -n -10 2612 更改程序2612的優先級為-10
[root@contes6 ~]# ps axu
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
使用者 占用CPU百分比 占用記憶體百分比 承諾記憶體大小 終端編号 狀态 開啟時間 占用cup時間片 程序程式名
top 指令可以動态的跟蹤記憶體CPU情況
top - 10:51:32 up 25 min, 2 users, load average: 0.00, 0.00, 0.00 :這一行是uptime指令的結果顯示
Tasks: 142 total, 1 running, 141 sleeping, 0 stopped, 0 zombie
tasks 程序
Cpu(s): 0.0%us, 0.2%sy, 0.0%ni, 99.7%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
0.0%us, :使用者空間使用
0.2%sy :系統空間占用
0.0%ni :調整優先級
99.7%id :空閑的cpu
0.0%wa :等待的CPU
0.0%hi :硬中斷,例如我鍵盤敲了一下,硬體就會給CPU發信号,我這邊發生了什麼事
0.2%si :軟中斷,應用程式發生了事,CPU去響應
0.0%st :被盜取得時間
Mem: 1004112k total, 352980k used, 651132k free, 22272k buffers
Swap: 2097148k total, 0k used, 2097148k free, 125148k cached
預設是cpu排序
大寫M是記憶體排序
大寫P是CPU排序
小寫l是隐藏uptime指令結果,在敲l顯示uptime指令結果
小寫t是隐藏和顯示程序的情況
數字1是顯示cpu
小寫m控制記憶體的顯示情況
q退出目前界面
s修改重新整理的間隔時間
top -d 5 指定重新整理間隔為5秒
k指定殺死程序,輸入程序編号
大寫W是儲存到檔案,預設儲存到家目錄是隐藏檔案 .toprc
top -b 檢視所有程序
top -n 重新整理3次自動退出
top -n 3 -b -d 2 :顯示全部程序,重新整理的間隔時間為2秒,總共重新整理3次
htop 帶顔色的程序管理工具
yum install htop
free檢視記憶體使用情況
echo 1 > /proc/sys/vm/drop_caches 清除記憶體裡面的緩存
VMstat :專門檢視管理虛拟記憶體資訊
vmstat 1 :1秒執行一次
vmstat 2 3 :2秒重新整理一次,重新整理3次就退出
iostat :顯示記憶體和cup的資訊
iiostat 1 1秒執行一次
pmap :程序和記憶體的對應關系
pmap 1 :pmap後加程序編号
pmap -x 1 :顯示詳細資訊
cat /proc/1/maps 檢視1程序編号的記憶體具體使用情況
glancens 遠端監控工具
yum install glances
開啟glances ,在被監控端,以伺服器的方式開啟,開啟以後會監控一個端口,然後在另一台機器以glances用戶端連接配接被監控的主機
glances -s -B 192.168.249.141
-s 伺服器
-B 監控的ip端口
ss -nlt 檢查ip端口服務是不是被啟動
glances -c 192.168.249.141 在用戶端開啟glances 連接配接被監控的伺服器
dstat工具,系統資源統計,代替vmstat,iostat
yum install dstat
dstat --top-cpu 檢視CPU占用最高的程序
dstat --top-io 内個磁盤消耗的讀寫最多
iotop用來觀察和磁盤I/O相關的工具
yum install iotop
pidof ping 檢視ping指令的程序編号
kill 向程序發送控制信号
1 信号 讓某個程序挂起,同時重新讀取配置檔案
2 信号 終止正在執行的程式
3 信号 相當于ctrl+\
15信号 正常退出
18 信号繼續執行
19 信号程序休眠
9 信号 強制殺死程序
killall 後面跟程序的名稱 :同時殺死相同名字的程序
例:killall httpd
pkill -t pts/0 殺死pts/0的所有程序,預設的信号是15
pkill 和pgrep共用一個man幫助
pkill 支援擴充正規表達式
前背景切換
程序有兩種前台和背景程序
前台執行占用終端資源,前台程序如果不結束,終端資源就沒有辦法被其他指令執行
背景執行:在指令的後面加一個& ,就變成背景執行,不耗費終端資源
輸出結果還是在終端是顯示,但是可以執行其他指令
例:ping 172.20.0.1 &
jobs 可以檢視正在執行的背景程序
[1]+ Running ping 172.20.0.1 &
将背景程序變成前台程序
fg 1 :1是jobs檢視的背景程序的編号,
在執行背景程式的時候不能用crtl+c 結束,要把它變成前台程序或者來來來殺死程序
将前台程序變成背景程序
例:ping 172.20.0.1 前台程序
Ctrl+z 把正在執行的前台程序變成背景程序,但是是休眠狀态
[1]+ Stopped ping 172.20.0.1
stopped 背景休眠
把背景休眠變成背景執行
bg 1
或
killall -18 ping
把背景運作變成背景休眠
killall -19 ping
把背景程序殺死
1:jobs 檢視背景程序編号
2:kill %1 :%後面跟的是jobs檢視到的程序編号
背景的作業,雖然在背景執行但是和終端相關,終端關閉,背景作業就停止
如果真正執行背景備份忽然斷網怎麼辦?
可以開啟一個異常共享會話 screen
如果斷網可以用 screen -r 恢複
1:screen 建立一個單獨的會話
2:ping 172.20.0.1 & 在單獨的會話中執行背景指令
3:screen -r :如果忽然斷網,可以用 -r恢複繼續執行
nohup ping 172.20.0.1 &
将背景的螢幕輸出放到 nohup.out 檔案裡面
讓3個指令工具同時執行,并行執行
第一種方法:vim all.sh
#/bin/bahs
ping 127.1 &
ping 127.2 &
ping 127.3 &
第二種方法:(ping 127.1 &);(ping 127.2 &);(ping 127.3 &)
第三種方法:{ ping 127.1 & ping 127.2 & ping 127.3 & }
任務管理
分為一次性任務計劃和周期性任務計劃
在未來的某個時間執行 ,一次性計劃任務 at
rpm -ivh at-3.1.13-22.el7.x86_64.rpm 安裝at包
systemctl status atd 檢視是不是running狀态,如果不是手動開啟
centos7 開啟:systemctl start atd
systemctl enable atd
centos6 開啟:service atd start
at -V 顯示版本資訊
題外:永久同步時間
centos 7: vim /etc/chrony.conf
server 172.20.0.1 iburst 加入這一行
centos 6: vim /etc/ntp.conf
ntpdate 172.20.0.1 同步伺服器時間
centos7 開啟服務
systemctl enable chronyd 開機啟動
systemctl start chronyd 啟動服務
centos6 開啟服務
chkconfig ntpd on 開機啟動
service ntpd start 開啟服務
[root@centos6 ~]#at 18:00 設定将來的一個時間
at> rm /data/* -rf 要執行的任務
at> <EOT> Ctrl+d 結束
job 1 at 2018-05-05 18:00 顯示有一個任務計劃在幾點幾分執行
at -l 檢視任務計劃
1 2018-05-05 18:00 a root
at -c 1 :檢視第1個任務計劃的内容
任務計劃被放在檔案裡面,重新開機不會丢失
cat /var/spool/at/a000010183f558
[root@centos6 ~]#at now + 15minutes 在未來的15分鐘
at> wall class is over 發一個廣播
at> <EOT> ctrl+d結束
job 2 at 2018-05-05 15:56
檢視任務計劃
[root@centos6 ~]#at -l
2 2018-05-05 15:56 a root
at -d 1 :删除第一個任務計劃
-l 檢視任務清單
-c 檢視任務計劃内容
-d 删除任計劃
-f 讀取任務檔案
-m 強制發郵件
建立一個廣播檔案
[root@centos6 ~]#cat > f1.txt
wall hello ha ha ha
在未來的一分鐘執行檔案
[root@centos6 ~]#at -f f1.txt now + 1minutes
job 3 at 2018-05-05 15:50
如果計劃任務帶标準輸出,不會在目前終端顯示,但是它會以郵件的方式發給你
如果計劃任務裡面有标準輸出會造成大量的垃圾郵件,把标準輸出重定向到&> /dev/null
at -m 如果你不知道你的任務計劃執沒執行,就加一個-m強制發郵件
白名單和黑名單:可以規定哪個使用者可以執行計劃,哪個使用者不可以執行任務計劃
白名單 :/etc/at.allow 預設不存在,要建立,将使用者加入白名單
黑名單 :/etc/at.deny 預設存在 将使用者寫入檔案,使用者就不能執行任務計劃
如果有白名單,隻有白名單裡面的使用者能執行任務計劃,其他使用者不能執行
如果沒有有白名單,隻有黑名單那隻有黑名單裡面的使用者不能執行任務計劃,其他使用者都可以
用腳本建立計劃任務
#!/bin/bash
at 18:00 <<end
rm /data/* -rf
end
周期性計劃任務 cron
rpm -ivh /mnt/cdrom/Packages/cronie-1.4.11-17.el7.x86_64.rpm
centos7 :啟動服務 systemctl start crond
開機啟動 systemctl enable crond
centos6 :啟動服務 service crond start
開機啟動
rpm -ivh /misc/cd/Packages/cronie-anacron-1.4.4-16.el6_8.2.x86_64.rpm
補充工具,用于監控cronie任務執行情況,如果任務計劃在該執行的時間點沒有執行,則anacron會随後啟動一次任務計劃
cat /etc/anacrontab
rpm -ivh /misc/cd/Packages/crontabs-1.10-33.el6.noarch.rpm
包括了和系統相關的輔助性計劃任務
/etc/crontab :屬于系統的關于任務計劃的配置檔案,這個檔案定義了計劃任務相關資訊
[root@centos7 ~]#cat /etc/crontab
SHELL=/bin/bash :用的shell類型
PATH=/sbin:/bin:/usr/sbin:/usr/bin :計劃任務有一些可執行程式,這些程式在哪個路徑下搜尋
MAILTO=root :如果計劃發現資訊,給相應的人發郵件
# For details see man 4 crontabs
# Example of job definition:
# .---------------- minute (0 - 59) 幾分鐘
# | .------------- hour (0 - 23) 幾小時小時
# | | .---------- day of month (1 - 31) 幾天
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ... 一年12個月
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 星期幾,也可以 1-5顯示星期一到星期五
# | | | | |
# * * * * * user-name command to be executed
*代表每分鐘,每小時,每天,每月,每星期
例:
52 16 * * * root wall hello
16點52分 每天 每月 每星期 root使用者 執行廣播
1 17 * * * root tar zcvf /data/etc.tar.gz /etc/ &> /dev/null
5點01分 每天 每月 每星期 root使用者執行/etc/下的檔案壓縮到data目錄下 ,并重定向到垃圾黑洞
标準輸出重定向到/dev/null ,不然會發送垃圾郵件
16 17 1,10,20 * * root
1号,10号,20号,每月每星期17點16分 root使用者執行某程式
16 17 1,10,20 * 0,6 root tar Jcvf /data/etc.tar.xz /etc/ &> /dev/null
1号,10号,20号或星期日和星期六17點16分 root使用者執行程式
ti=`date +%u`
[ $ti -eq 6 -o $ti -eq 0 ] && wall hello
chmod +x f2.sh
vim /etc/crontab
40 17 * * * root /root/f2.sh
每天每月每星期17點40執行f2.sh腳本
40 17 1.10,20 * 0,6 root /root/f2.sh
每月的1号10号20号并且星期日和星期六執行程式
*/10 17 1.10,20 * 0,6 root /root/f2.sh
17點每10分鐘執行一次
* * * * * root f2.sh
root使用者每分鐘執行一次腳本
1 * * * * root f2.sh
root使用者每小時的第一分鐘執行一次腳本
vim f3.sh
md0 指令
leep 20 休眠20秒
md20 指令
md30 指令
* * * * * root f3.sh
每20秒執行一次指令
usleep可以精确到微秒 1000000微秒等于一秒
@monthly root /root/f2.sh
每月1号執行一次檔案
@reboot root /root/f2.sh
當重新開機的時候執行某個操作
@hourly 一小時執行一次
@daily 一天執行一次
@weekly 一周執行一次
@monthly 一月執行一次
@annually 一年執行一次
cat /var/log/cron 日志記錄了目前發生的事件
每個單使用者建立任務計劃用 crontab
crontab -e 要建立計劃任務
* * * * * wall hello 每分鐘廣播一次 不需要寫使用者名
cat /var/spool/cron 計劃任務放在這個檔案,放在磁盤上
在root使用者編輯普通使用者的計劃任務
crontab -l -u wang 檢視wang使用者的計劃任務
crontab -e -u wang 編輯wang使用者的計劃任務
crontab -r -u wang 删除wang使用者的計劃任務
單使用者的白名單和黑名單
白名單 :/etc/cron.allow 預設不存在,要建立,将使用者加入白名單
黑名單 :/etc/cron.deny 預設存在 将使用者寫入檔案,使用者就不能執行任務計劃
在cron裡面的%号有特殊含義,不能直接使用,寫在腳本裡面直接調用
練習題
1、每周的工作日1:30,将/etc備份至/backup目錄中,儲存的檔案名稱格式
為“etcbak-yyyy-mm-dd-HH.tar.xz” ,其中日期是前一天的時間
vim time.sh
date -d "-1 day" +%F-%H
chmod +x time.sh
05 21 * * * root tar Jcvf /data/etcbak-`. time.sh`.tar.xz /etc/
2、每兩小時取出目前系統/proc/meminfo檔案中以S或M開頭的資訊追加至
/tmp/meminfo.txt檔案中
* */2 * * * cat /proc/meminfo |egrep "^(S|M)" >> /tmp/meminfo.txt
3、工作日時間,每10分鐘執行一次磁盤空間檢查,一旦發現任何分區使用率高
于80%,就執行wall警報
vim disk.sh
disk1=`df |grep "sd" |sed -r "s/.*[ ]+([0-9]{1,3}).*/\1/" |sort -nr |head -n1`
disk2=`df -i |grep "sd" |sed -r "s/.*[ ]+([0-9]{1,3}).*/\1/" |sort -nr |head -n1`
[ $disk1 -ge 80 -o $disk2 -ge 80 ] && wall Disk over 80%
*/10 * * * 1-5 root disk.sh
$RANDOM 産生随機數字
$[$uid%2] $uid是一個數字,
[ $[$uid%2] -eq 0 ] 數字除2等于0就是偶數
任務計劃分為兩種:
第一種是一次性計劃at
第二種是周期性計劃crontab
<b>一次性計劃任務:在未來的某個時間執行一次性計劃任務 at</b>
centos7 開啟 :systemctl start atd
centos6 開啟 :service atd start
at> <EOT> Ctrl+d 結束
任務計劃被放在at目錄下的檔案裡面,重新開機不會丢失
[root@centos6 ~]#at -f f1.txt now + 1minutes
如果計劃任務帶标準輸出,不會在目前終端顯示,但是它會以郵件的方式發給你,這樣就會造成大量的垃圾郵件,把标準輸出重定向到&> /dev/null ,就不會收到郵件
at -m 如果你不知道你的任務計劃執有沒有執行,就加一個-m強制發郵件,到你的郵箱
黑名單 :/etc/at.deny 預設存在将使用者寫入檔案,使用者就不能執行任務計劃
規則 :如果有白名單,隻有白名單裡面的使用者能執行任務計劃,其他使用者不能執行
如果沒有白名單,隻有黑名單那隻有黑名單裡面的使用者不能執行任務計劃,其他使用者都可以
<b> </b><b>周期性計劃任務 cron</b>
MAILTO=root :如果計劃發出資訊,給相應的人發郵件
# .—————- minute (0 – 59) 幾分鐘
# | .————- hour (0 – 23) 幾小時小時
# | | .———- day of month (1 – 31) 幾天
# | | | .——- month (1 – 12) OR jan,feb,mar,apr … 一年12個月
# | | | | .—- day of week (0 – 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat 星期幾,也可以 1-5顯示星期一到星期五
* * * * *代表每分鐘,每小時,每天,每月,每星期
ti=date +%u 設定一個ti的變量
[ $ti -eq 6 -o $ti -eq 0 ] && wall hello 如果數字等于6會在0 會發送一個hello的廣播
星期六和星期日17點40執行f2.sh腳本,發送廣播
ti=date +%u
40 17 1,10,20 * * root /root/f2.sh
每月的1号10号20号并且星期日和星期六17:40執行程式
例:執行指令的間隔為秒
md0執行 指令
md20 執行指令
md30執行 指令
<b>每個單使用者建立任務計劃用 crontab</b>
cat /var/spool/cron 計劃任務放在這個檔案,在root使用者下可以檢視和修改
黑名單 :/etc/cron.deny 預設存在将使用者寫入檔案,使用者就不能執行任務計劃
date -d “-1 day” +%F-%H
05 21 * * * root tar Jcvf /data/etcbak-. time.sh.tar.xz /etc/
* */2 * * * cat /proc/meminfo |egrep “^(S|M)” >> /tmp/meminfo.txt
disk1=df |grep "sd" |sed -r "s/.*[ ]+([0-9]{1,3}).*/\1/" |sort -nr |head -n1
disk2=df -i |grep "sd" |sed -r "s/.*[ ]+([0-9]{1,3}).*/\1/" |sort -nr |head -n1