程序:保存在硬盤、光盤等介質中的可執行代碼和數據,屬於靜態保存的代碼linux
進程:在CPU及內存中運行的程序代碼,屬於動態執行的代碼shell
一個應用程序能夠包含一個或多個進程,一個進程包含一個或多個線程,線程是執行操做的最小單元vim
ps:對應高併發處理===使用多線程操做bash
ps 命令——不是Photoshop哈!服務器
man 手冊對其做用的描述是這樣的:「displays information about a selection of the active processes. If you want a repetitive update of the selection and the displayed information, use top(1) instead.」session
其意思爲:顯示有關活動進程的選擇的信息。若是但願對選擇和顯示的信息進行重複更新,請使用top(這裏的top也是查看進程的信息的,可是是動態查看,下面會具體講述)多線程
ps [選項] [參數]併發
在man 手冊上給出的案例我節選部分經常使用的出來進行演示和講述:dom
-aux :「-」能夠省略,表示查看系統中使用BSD語法規則的每一個進程 ssh
-elf:表示查看系統中使用標準語法的每一個進程,不能省略「-」
實例以下:
[root@lokott ~]# ps aux //ps -aux也同樣 USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.0 0.4 210140 4864 ? Ss 14:23 0:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 root 2 0.0 0.0 0 0 ? S 14:23 0:00 [kthreadd] root 3 0.0 0.0 0 0 ? S 14:23 0:00 [ksoftirqd/0] root 5 0.0 0.0 0 0 ? S< 14:23 0:00 [kworker/0:0H] root 6 0.0 0.0 0 0 ? S 14:23 0:00 [kworker/u256:0] root 7 0.0 0.0 0 0 ? S 14:23 0:00 [migration/0] root 8 0.0 0.0 0 0 ? S 14:23 0:00 [rcu_bh] root 9 0.0 0.0 0 0 ? R 14:23 0:00 [rcu_sched] ...
解釋:PID表示進程ID,%CPU表示CPU使用率,%MEM表示內存使用率,TTY表示終端,STAT表示的是狀態:S 是sleep可中斷,s表示父進程,<表示的是優先級高,R正在運行的進程, l表示的是多線性進程,N優先級低,Z殭屍進程,D不可中斷休眠進程,+前臺進程。
[root@lokott ~]# ps -elf //當前-長格式—完整形式 F S UID PID PPID C PRI NI ADDR SZ WCHAN STIME TTY TIME CMD 4 S root 1 0 0 80 0 - 52535 ep_pol 14:23 ? 00:00:01 /usr/lib/systemd/systemd --switched-root --system --deserialize 21 1 S root 2 0 0 80 0 - 0 kthrea 14:23 ? 00:00:00 [kthreadd] 1 S root 3 2 0 80 0 - 0 smpboo 14:23 ? 00:00:00 [ksoftirqd/0] 1 S root 5 2 0 60 -20 - 0 worker 14:23 ? 00:00:00 [kworker/0:0H] 1 S root 6 2 0 80 0 - 0 worker 14:23 ? 00:00:00 [kworker/u256:0] 1 S root 7 2 0 -40 - - 0 smpboo 14:23 ? 00:00:00 [migration/0] 1 S root 8 2 0 80 0 - 0 rcu_gp 14:23 ? 00:00:00 [rcu_bh] ....
解釋:PPID表示父進程 PRI表示的是用戶態的優先級 NI表示的是NICE值(內核),範圍是(-20~19)值越低越優先
,SZ交換分區佔用的空間大小
在ps命令中通常能夠結合管道符號和grep等命令組合使用,提升工做效率
[root@lokott ~]# top //每三秒會自動刷新一次 top - 15:58:48 up 1:35, 3 users, load average: 0.00, 0.01, 0.05 Tasks: 190 total, 1 running, 189 sleeping, 0 stopped, 0 zombie %Cpu(s): 0.0 us, 0.0 sy, 0.0 ni,100.0 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st KiB Mem : 999696 total, 65636 free, 711552 used, 222508 buff/cache KiB Swap: 4194300 total, 4160824 free, 33476 used. 78272 avail Mem PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 619 root 20 0 231608 3264 2836 S 0.3 0.3 0:03.25 vmtoolsd 4582 root 20 0 0 0 0 S 0.3 0.0 0:00.20 kworker/0:2 1 root 20 0 210140 4864 3024 S 0.0 0.5 0:01.35 systemd 2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd 3 root 20 0 0 0 0 S 0.0 0.0 0:00.06 ksoftirqd/0 5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H .....
在top命令下,進程的查看是動態變化的,m能夠進行內存使用率排序c能夠進行cpu排序,q能夠退出,或者Ctrl+c直接終止該命令。
pgrep命令
在man手冊中pgrep和pkill是放在一塊兒的,以下所示:
NAME //命令名稱,根據名字或者其餘屬性查找進程
pgrep, pkill - look up or signal processes based on name and other attributes
SYNOPSIS //表示的是命令的格式
pgrep [options] pattern
pkill [options] pattern
DESCRIPTION
pgrep looks through the currently running processes and lists the process IDs which match the selection criteria to stdout. All the criteria have to match. For example,
$ pgrep -u root sshd will only list the processes called sshd AND owned by root. On the other hand, $ pgrep -u root,daemon will list the processes owned by root OR daemon. pkill will send the specified signal (by default SIGTERM) to each process instead of listing them on stdout.
那麼我就根據上面給出的例子來進行實驗:(pkill下面有講)
[root@lokott ~]# pgrep -u root sshd //僅僅列出名稱爲sshd且屬於root的進程號 1002 2820 [root@lokott ~]# pgrep -u root,daemon |wc -l //列出屬於root或者daemon的全部進程號到管道中統計數量 175 [root@lokott ~]# pgrep -l "log" //查看包含log的進程id和信息 292 xfs-log/sda2 479 xfs-log/sda5 480 xfs-log/sda1 593 abrt-watch-log 596 systemd-logind 601 rsyslogd 602 abrt-watch-log 2735 xfs-log/md0
樹型查看——pstree
-aup 「-」不能夠省略,pstree -ap 用戶名
前臺啓動:用戶輸入命令,直接執行程序
後臺啓動:在命令行尾加入「&」符號
進程的先後臺調度
Ctrl+z——中止進程
jobs -l ——查看進程狀態
fg 序號——將進程掉到前臺來執行
bg 序號——將中止的進程在後臺繼續執行
[root@lokott ~]# umount /mnt [root@lokott ~]# mount /dev/sr0 /mnt mount: /dev/sr0 寫保護,將以只讀方式掛載 [root@lokott ~]# df -hT 文件系統 類型 容量 已用 可用 已用% 掛載點 /dev/sda2 xfs 20G 4.4G 16G 22% / devtmpfs devtmpfs 474M 0 474M 0% /dev tmpfs tmpfs 489M 0 489M 0% /dev/shm tmpfs tmpfs 489M 7.2M 482M 2% /run tmpfs tmpfs 489M 0 489M 0% /sys/fs/cgroup /dev/sda5 xfs 10G 37M 10G 1% /home /dev/sda1 xfs 6.0G 158M 5.9G 3% /boot tmpfs tmpfs 98M 4.0K 98M 1% /run/user/42 tmpfs tmpfs 98M 24K 98M 1% /run/user/0 /dev/sr0 iso9660 4.3G 4.3G 0 100% /mnt [root@lokott ~]# cd /mnt/ [root@lokott mnt]# ls CentOS_BuildTag GPL LiveOS RPM-GPG-KEY-CentOS-7 EFI images Packages RPM-GPG-KEY-CentOS-Testing-7 EULA isolinux repodata TRANS.TBL [root@lokott mnt]# cd [root@lokott ~]# cp -r /mnt/Packages/ /opt/ & //&符號就是將該命令放在後臺運行 [1] 5354 [root@lokott ~]# jobs -l //查看進程完成狀態 [1]+ 5354 完成 cp -i -r /mnt/Packages/ /opt/ [root@lokott ~]# cp -r /mnt/Packages/ /opt/ //刪除原來的而後從新再前臺執行命令 ^Z [1]+ 已中止 cp -i -r /mnt/Packages/ /opt/ [root@lokott ~]# jobs -l //查看進程狀態 [1]+ 5403 中止 cp -i -r /mnt/Packages/ /opt/ [root@lokott ~]# fg 1 //調出後臺進程到前臺來進行運行 cp -i -r /mnt/Packages/ /opt/ ^Z [1]+ 已中止 cp -i -r /mnt/Packages/ /opt/ [root@lokott ~]# kill -9 5403 //強制kill 掉進程(-9) [root@lokott ~]# jobs -l [1]+ 5403 已殺死 cp -i -r /mnt/Packages/ /opt/
Ctrl+c ——中斷正在執行的命令
1.kill、killall命令
kill用於終止指定PID號的進程 -9 表示強制終止
killall用於終止指定名稱的全部進程
上面的實例中已經給出了kill 的實例,下面看一下killall的實例:
[root@lokott ~]# vim 1.sh & [3] 5696 [root@lokott ~]# vim 2.sh & [4] 5697 [3]+ 已中止 vim 1.sh [root@lokott ~]# jobs -l [1] 5694 中止 (tty 輸出) vim 1.sh [2] 5695 中止 (tty 輸出) vim 1.sh [3]- 5696 中止 (tty 輸出) vim 1.sh [4]+ 5697 中止 (tty 輸出) vim 2.sh [root@lokott ~]# killall -9 vim [1] 已殺死 vim 1.sh [2] 已殺死 vim 1.sh [3]- 已殺死 vim 1.sh [4]+ 已殺死 vim 2.sh [root@lokott ~]#
2.pkill命令
根據特定條件終止相應的進程——pkill命令(實際上用的很是多)
-U:根據進程所屬的用戶名終止相應進程
-t:根據進程所在的終端終止相應進程
[root@lokott ~]# pgrep -l -U "zhangsan" 1472 gnome-keyring-d 1491 gnome-session-b 1498 dbus-launch 1499 dbus-daemon 1557 gvfsd 1562 gvfsd-fuse 1649 ssh-agent 1668 at-spi-bus-laun 1673 dbus-daemon 1678 at-spi2-registr 1695 gnome-shell ....... 2208 gvfsd-metadata 2211 ibus-engine-sim [root@lokott ~]# pkill -9 -U zhangsan //前臺是本地是張三登陸的狀態此時服務器那邊會將zhangsan用戶踢出,而後到登陸界面
小結:普通用戶是沒法用pkill命令踢出root,但能夠用pgrep查看
命令格式——at [HH:MM] [yyyy-mm-dd]
注意:這個命令是必須將時間用在以後的時間,例如:at 10:33 2020-08-05
而後輸入命令,最後Ctrl+D
date命令——獲取當前時間
atq——查看準備被執行的進程列表
atrm 2——刪除
請看實例:
[root@lokott ~]# date //顯示當前時間 2019年 11月 12日 星期二 17:28:24 CST [root@lokott ~]# at 17:35 2019-11-12 //設定計劃任務 at> pgrep -U root |wc -l > /opt/ps.txt at> <EOT> job 1 at Tue Nov 12 17:35:00 2019 [root@lokott ~]# cat /opt/ps.txt //因爲時間未到全部無法看到 cat: /opt/ps.txt: 沒有那個文件或目錄 [root@lokott ~]# atq 1 Tue Nov 12 17:35:00 2019 a root [root@lokott ~]# at 17:34 2019-11-12 at> echo "123" > 1.txt at> <EOT> job 2 at Tue Nov 12 17:34:00 2019 [root@lokott ~]# atq //查看一次性任務命令 1 Tue Nov 12 17:35:00 2019 a root 2 Tue Nov 12 17:34:00 2019 a root [root@lokott ~]# ls 1.txt note 模板 文檔 桌面 anaconda-ks.cfg shell 視頻 下載 initial-setup-ks.cfg 公共 圖片 音樂 [root@lokott ~]# cat 1.txt 123 [root@lokott ~]# atrm 1 //刪除還未執行的任務 [root@lokott ~]# atq [root@lokott ~]# atrm 1 //已刪除和已經完成的任務沒法再次刪除 Cannot find jobid 1
該序列號是固定的,而不是動態的,這是爲了不多終端時你們刪除任務的時候誤刪
crontab命令(重要)——定時任務(按照預先設置的時間週期重複執行用戶指定的命令操做),man手冊上的介紹是:crontab - maintains crontab files for individual users
編寫格式爲分 時 日 月 周 命令,下面的/etc/crontab文件中有顯示寫入格式
其中*表示該範圍內的任意時間,-表示連續的時間
,表示不連續的時間點,/表示頻率
對於該命令,個人理解就是——「私人訂製」,這個命令能夠用來存儲一個定時任務製表文件,能夠用來對週期性定時任務的設置(-e)刪除(-r)和查看(-l)等操做,實例以下:
[root@lokott ~]# which crontab //查看crontab命令的位置 /usr/bin/crontab [root@lokott ~]# cat /etc/crontab //查看命令的配置文件信息 SHELL=/bin/bash 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 ... # | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat # | | | | | # * * * * * user-name command to be executed [root@lokott ~]# crontab -e //打開一個交互窗口寫入命令,命令在下面用-l參數能夠顯示 no crontab for zhangsan - using an empty one crontab: installing new crontab [root@lokott ~]# crontab -l //顯示寫入的命令代碼,表示每分鐘寫入一次12346 * * * * * echo "12346" >> 1.txt [root@lokott ~]# cat 1.txt hello hello [root@lokott ~]# cat 1.txt hello hello 12346 12346 12346
主要的設置文件位置:
[root@lokott ~]# ls /etc/cron.*/ /etc/cron.d/: 0hourly raid-check sysstat /etc/cron.daily/: logrotate man-db.cron mlocate /etc/cron.hourly/: 0anacron /etc/cron.monthly/: /etc/cron.weekly/: [root@lokott ~]# su - zhangsan [zhangsan@lokott ~]$ crontab -l 5 10 * * 1-5 echo "haha" > 1.txt //週一至週五10:05執行命令 6 10 * * 2,4,6 echo "ttuu" >> 1.txt //周2、4、六的10:06執行命令 10 10-14/2 * * * echo "sdas" >> 1.txt //天天的10點10分至14點10分每兩小時執行一次命令 */5 * */2 * * ls ./shell //每隔兩天,每隔5分鐘執行命令 [root@lokott zhangsan]# cat /var/spool/cron/zhangsan //用戶定義的設置在該文件中 5 10 * * 1-5 echo "haha" > 1.txt 6 10 * * 2,4,6 echo "ttuu" >> 1.txt 10 10-14/2 * * * echo "sdas" >> 1.txt */5 * */2 * * ls ./shell */1 * * * * echo "sdsad" >> 1.txt [zhangsan@lokott ~]$ crontab -e //我準備添加新的計劃任務 crontab: installing new crontab 您在 /var/spool/mail/zhangsan 中有新郵件 //提示我有新的內容,其實就是報錯的信息,信息以下所示 [zhangsan@lokott ~]$ cat /var/spool/mail/zhangsan From zhangsan@lokott.localdomain Wed Nov 13 10:05:02 2019 Return-Path: <zhangsan@lokott.localdomain> X-Original-To: zhangsan Delivered-To: zhangsan@lokott.localdomain Received: by lokott.localdomain (Postfix, from userid 1001) id 04DC131C6EDF; Wed, 13 Nov 2019 10:05:01 +0800 (CST) From: "(Cron Daemon)" <zhangsan@lokott.localdomain> To: zhangsan@lokott.localdomain Subject: Cron <zhangsan@lokott> ls ./shell Content-Type: text/plain; charset=UTF-8 Auto-Submitted: auto-generated Precedence: bulk X-Cron-Env: <XDG_SESSION_ID=149> X-Cron-Env: <XDG_RUNTIME_DIR=/run/user/1001> X-Cron-Env: <LANG=zh_CN.UTF-8> X-Cron-Env: <SHELL=/bin/sh> X-Cron-Env: <HOME=/home/zhangsan> X-Cron-Env: <PATH=/usr/bin:/bin> X-Cron-Env: <LOGNAME=zhangsan> X-Cron-Env: <USER=zhangsan> Message-Id: <20191113020502.04DC131C6EDF@lokott.localdomain> Date: Wed, 13 Nov 2019 10:05:01 +0800 (CST)
本文主要是對Linux中進程和計劃任務的管理的介紹和命令演示,包括靜態查看(ps)和動態查看(top)進程命令,按條件查看(pgrep)和以樹型結構查看(pstree);其次是對進程控制的介紹,包括啓動進程,調度進程(Ctrl+Z、jobs、fg、bg)以及終止進程的命令(kill、killall、pkill);最後是對計劃任務設置命令的介紹,即at和crontab命令,其中注意at是一次性有效,且須要在當前時間(date命令查看當前時間)以後,有年份設置,而crontab命令是計劃性週期命令,沒有年份的設置。
最後感謝閱讀!