溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux/Centos7系統(tǒng)管理之進(jìn)程與計劃任務(wù)管理

發(fā)布時間:2020-09-01 19:42:38 來源:網(wǎng)絡(luò) 閱讀:689 作者:wx5d8a17c45cb5b 欄目:系統(tǒng)運維

Linux/Centos7系統(tǒng)管理之進(jìn)程與計劃任務(wù)管理

  1. 查看進(jìn)程——靜態(tài)和動態(tài)查看
  2. 控制進(jìn)程——條件和全部
  3. at 一次性任務(wù)設(shè)置
  4. crontab 周期性任務(wù)設(shè)置

一、程序和進(jìn)程的關(guān)系

(1)概念

程序:保存在硬盤、光盤等介質(zhì)中的可執(zhí)行代碼和數(shù)據(jù),屬于靜態(tài)保存的代碼

進(jìn)程:在CPU及內(nèi)存中運行的程序代碼,屬于動態(tài)執(zhí)行的代碼

(2)如何理解應(yīng)用程序、進(jìn)程及線程的概念和聯(lián)系

  1. 應(yīng)用程序——工廠
  2. 進(jìn)程——車間
  3. 線程——工人

一個應(yīng)用程序可以包含一個或多個進(jìn)程,一個進(jìn)程包含一個或多個線程,線程是執(zhí)行操作的最小單元

ps:對應(yīng)高并發(fā)處理===使用多線程操作

二、進(jìn)程相關(guān)命令

(1)查看進(jìn)程信息ps

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.”

其意思為:顯示有關(guān)活動進(jìn)程的選擇的信息。如果希望對選擇和顯示的信息進(jìn)行重復(fù)更新,請使用top(這里的top也是查看進(jìn)程的信息的,但是是動態(tài)查看,下面會具體講述)

(2)ps命令的格式

ps [選項] [參數(shù)]

在man 手冊上給出的案例我節(jié)選部分常用的出來進(jìn)行演示和講述:

-aux :“-”可以省略,表示查看系統(tǒng)中使用BSD語法規(guī)則的每個進(jìn)程

-elf:表示查看系統(tǒng)中使用標(biāo)準(zhǔn)語法的每個進(jìn)程,不能省略“-”

實例如下:

[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表示進(jìn)程ID,%CPU表示CPU使用率,%MEM表示內(nèi)存使用率,TTY表示終端,STAT表示的是狀態(tài):S 是sleep可中斷,s表示父進(jìn)程,<表示的是優(yōu)先級高,R正在運行的進(jìn)程, l表示的是多線性進(jìn)程,N優(yōu)先級低,Z僵尸進(jìn)程,D不可中斷休眠進(jìn)程,+前臺進(jìn)程。

[root@lokott ~]# ps -elf    //當(dāng)前-長格式—完整形式                  
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表示父進(jìn)程 PRI表示的是用戶態(tài)的優(yōu)先級 NI表示的是NICE值(內(nèi)核),范圍是(-20~19)值越低越優(yōu)先

,SZ交換分區(qū)占用的空間大小

(3)補充

在ps命令中一般可以結(jié)合管道符號和grep等命令組合使用,提高工作效率

(4)動態(tài)查看top

[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命令下,進(jìn)程的查看是動態(tài)變化的,m可以進(jìn)行內(nèi)存使用率排序c可以進(jìn)行cpu排序,q可以退出,或者Ctrl+c直接終止該命令。

四、條件查看進(jìn)程

pgrep命令

在man手冊中pgrep和pkill是放在一起的,如下所示:

NAME //命令名稱,根據(jù)名字或者其他屬性查找進(jìn)程
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.

那么我就根據(jù)上面給出的例子來進(jìn)行實驗:(pkill下面有講)

[root@lokott ~]# pgrep -u root sshd               //僅僅列出名稱為sshd且屬于root的進(jìn)程號
1002
2820
[root@lokott ~]# pgrep -u root,daemon |wc -l      //列出屬于root或者daemon的所有進(jìn)程號到管道中統(tǒng)計數(shù)量
175
[root@lokott ~]# pgrep -l "log"                 //查看包含log的進(jìn)程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 用戶名

五、進(jìn)程的啟動方式

1.啟動進(jìn)程

(1)手工啟動

前臺啟動:用戶輸入命令,直接執(zhí)行程序

后臺啟動:在命令行尾加入“&”符號

(2)調(diào)度啟動

進(jìn)程的前后臺調(diào)度

Ctrl+z——停止進(jìn)程

jobs -l ——查看進(jìn)程狀態(tài)

fg 序號——將進(jìn)程掉到前臺來執(zhí)行

bg 序號——將停止的進(jìn)程在后臺繼續(xù)執(zhí)行

[root@lokott ~]# umount /mnt
[root@lokott ~]# mount /dev/sr0 /mnt
mount: /dev/sr0 寫保護(hù),將以只讀方式掛載
[root@lokott ~]# df -hT
文件系統(tǒng)       類型      容量  已用  可用 已用% 掛載點
/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                                  //查看進(jìn)程完成狀態(tài)
[1]+  5354 完成                  cp -i -r /mnt/Packages/ /opt/
[root@lokott ~]# cp -r /mnt/Packages/ /opt/                  //刪除原來的然后重新再前臺執(zhí)行命令
^Z
[1]+  已停止               cp -i -r /mnt/Packages/ /opt/
[root@lokott ~]# jobs -l                                  //查看進(jìn)程狀態(tài)
[1]+  5403 停止                  cp -i -r /mnt/Packages/ /opt/
[root@lokott ~]# fg 1                                     //調(diào)出后臺進(jìn)程到前臺來進(jìn)行運行
cp -i -r /mnt/Packages/ /opt/
^Z
[1]+  已停止               cp -i -r /mnt/Packages/ /opt/
[root@lokott ~]# kill -9 5403                                //強(qiáng)制kill 掉進(jìn)程(-9)
[root@lokott ~]# jobs -l
[1]+  5403 已殺死               cp -i -r /mnt/Packages/ /opt/

(3)終止進(jìn)程

Ctrl+c ——中斷正在執(zhí)行的命令

1.kill、killall命令

kill用于終止指定PID號的進(jìn)程 -9 表示強(qiáng)制終止

killall用于終止指定名稱的所有進(jìn)程

上面的實例中已經(jīng)給出了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命令

根據(jù)特定條件終止相應(yīng)的進(jìn)程——pkill命令(實際上用的非常多)

-U:根據(jù)進(jìn)程所屬的用戶名終止相應(yīng)進(jìn)程

-t:根據(jù)進(jìn)程所在的終端終止相應(yīng)進(jìn)程

[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  //前臺是本地是張三登錄的狀態(tài)此時服務(wù)器那邊會將zhangsan用戶踢出,然后到登錄界面

小結(jié):普通用戶是無法用pkill命令踢出root,但可以用pgrep查看

六、計劃任務(wù)管理

(1)at命令設(shè)置計劃任務(wù)

命令格式——at [HH:MM] [yyyy-mm-dd]

注意:這個命令是必須將時間用在之后的時間,例如:at 10:33 2020-08-05

然后輸入命令,最后Ctrl+D

date命令——獲取當(dāng)前時間

atq——查看準(zhǔn)備被執(zhí)行的進(jìn)程列表

atrm 2——刪除

請看實例:

[root@lokott ~]# date                                            //顯示當(dāng)前時間
2019年 11月 12日 星期二 17:28:24 CST
[root@lokott ~]# at 17:35 2019-11-12                           //設(shè)定計劃任務(wù)
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                                              //查看一次性任務(wù)命令
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                                       //刪除還未執(zhí)行的任務(wù)
[root@lokott ~]# atq
[root@lokott ~]# atrm 1                                          //已刪除和已經(jīng)完成的任務(wù)無法再次刪除
Cannot find jobid 1

該序列號是固定的,而不是動態(tài)的,這是為了避免多終端時大家刪除任務(wù)的時候誤刪

(2)周期性計劃任務(wù)配置——crontab命令

crontab命令(重要)——定時任務(wù)(按照預(yù)先設(shè)置的時間周期重復(fù)執(zhí)行用戶指定的命令操作),man手冊上的介紹是:crontab - maintains crontab files for individual users

  1. crontab -e [-u ]
  2. -l——list
  3. -r——remove 所有的

編寫格式為分 時 日 月 周 命令,下面的/etc/crontab文件中有顯示寫入格式

其中*表示該范圍內(nèi)的任意時間,-表示連續(xù)的時間

,表示不連續(xù)的時間點,/表示頻率

對于該命令,我的理解就是——“私人訂制”,這個命令可以用來存儲一個定時任務(wù)制表文件,可以用來對周期性定時任務(wù)的設(shè)置(-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參數(shù)可以顯示
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

主要的設(shè)置文件位置:

  1. 全局配置文件,位于文件/etc/crontab ——實例中已經(jīng)給出
  2. 系統(tǒng)默認(rèn)的設(shè)置位于目錄/etc/cron.*/
  3. 用戶定義的設(shè)置(必默寫)位于文件/var/spool/cron/用戶名。在編輯命令的過程中錯誤的命令被執(zhí)行的時候會將錯誤的信息存放到該文件中:/var/spool/mail/zhangsan
[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執(zhí)行命令
6 10 * * 2,4,6 echo "ttuu" >> 1.txt     //周二、四、六的10:06執(zhí)行命令
10 10-14/2 * * * echo "sdas" >> 1.txt   //每天的10點10分至14點10分每兩小時執(zhí)行一次命令
*/5 * */2 * * ls ./shell                //每隔兩天,每隔5分鐘執(zhí)行命令
[root@lokott zhangsan]# cat /var/spool/cron/zhangsan      //用戶定義的設(shè)置在該文件中
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        //我準(zhǔn)備添加新的計劃任務(wù)
crontab: installing new crontab
您在 /var/spool/mail/zhangsan 中有新郵件          //提示我有新的內(nèi)容,其實就是報錯的信息,信息如下所示
[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)

七、總結(jié)

本文主要是對Linux中進(jìn)程和計劃任務(wù)的管理的介紹和命令演示,包括靜態(tài)查看(ps)和動態(tài)查看(top)進(jìn)程命令,按條件查看(pgrep)和以樹型結(jié)構(gòu)查看(pstree);其次是對進(jìn)程控制的介紹,包括啟動進(jìn)程,調(diào)度進(jìn)程(Ctrl+Z、jobs、fg、bg)以及終止進(jìn)程的命令(kill、killall、pkill);最后是對計劃任務(wù)設(shè)置命令的介紹,即at和crontab命令,其中注意at是一次性有效,且需要在當(dāng)前時間(date命令查看當(dāng)前時間)之后,有年份設(shè)置,而crontab命令是計劃性周期命令,沒有年份的設(shè)置。

最后感謝閱讀!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI