Linux学习之进程管理

时间:2021-04-08 15:56:59

|-进程管理
 
    进程常用命令
    
    |- w查看当前系统信息
    
    |- ps进程查看命令
    
    |- kill终止进程
    
    |- 一个存放内存中的特殊目录/proc
    
    |- 进程的优先级
    
    |- 进程的挂起与恢复
    
    |- 通过top命令查看进程
    
    计划任务
    
    |- 计划任务的重要性
    
    |- 一次性计划at和batch
    
    |- 周期性计划crontab
    
进程管理的概念
    
  进程和程序区别
    
    1.程序是静态概念,本身作为一种软件资源长期保存;而进程是程序的执行过程,它是动态概念,有一定的生命期,是动态产生和消亡的。
    
    2.程序和进程无一一对应关系。一个程序可以由多个时程公用;另一一方面,一个进程在活动中有可顺序地执行若干个程序
    
  父子进程的关系
    
    1.子进程是由一个进程所产生的进程,产生这个子进程的进程称为父进程
    
    2.在linux系统中,使用系统调用fork创建进程。fork复制的内容包括父进程的数据和堆栈段以及父进程的进程环境。
    
    3.父进程终止子进程自然终止。
    
  前台进程和后台进程
  前台进程
    在shell提示处理打入命令后,创建一个子进程,运行命令,Shell等待命令退出,然后返回到对用户给出提示符。这条命令与Shell异步运行,即在前台运行,用户在它完成之前不能执行别一个命令,很简单,我们在执行这个查找命令时,无法进行其它操作,这个查找就属于前台进程

后台进程
    在Shell提示处打入命令,若后随一个&,Shell创建子进程运行此命令,但不等待命令退出,而直接返回到对用户给出提示。这条命令与Shell同步运行,即在后台运行。"后台进程必须是非交互式的" ,再来看这个命令就变成了后台进程,我们用同样的条件进行查找,把查找记过放到hzh/test/init.find这个文件中。不影响我们前台其它的操作。
 常用进程命令
    w 查看当前系统信息
    w命令,我在之前的章节用曾用过,当时是查看当前用户信息,当然也可以查看到系统相关的信息。
    作用:查看当前系统活动摘要。

     [root@bogon cron]# w
:: up :, user, load average: 0.00, 0.01, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ 192.168.203.1 : .00s .17s .02s w

w显示信息的含义:
    JCPU: 以终端代号来区分,该终端所有相关的进程的进程执行时,所消耗的CPU时间会显示在这里
    PCPU: cpu执行程序消耗的时间
    WHAT: 用户下在执行的操作
    load average :分别显示系统在过去1、5、15分钟内的平均负载程度。
    FROM:  显示用户从何处登录系统,":0"的显示代表该用户时人X Windows下,打开文本模式窗口登录的
   
IDLE:   用户闲置的时间,这是一个计时器,一旦用户执行任何操作,该计时器便会被重置
    查看个别用户信息:w [用户名]

     [root@localhost ~]# w root
:: up min, user, load average: 0.00, 0.00, 0.00
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/ 192.168.203.1 : .00s .10s .01s w root

ps进程查看命令
    进程查看命令:ps
    常用选项:
    -a:显示所有用户的进程
    -u:显示用户名和启动时间
    -x:显示没有控制终端的进程
    -e:显示所有进程,包括没有控制终端的进程
    -l:长格式显示
    -w:宽行显示,可以使用多个w进行加宽显示

应用实例:
    ps 查看隶属自己的进程
    root@fnngj-virtual-machine:~# ps

  PID TTY TIME CMD

      pts/ :: bash

      pts/ :: ps

     root@root:~# ps -l

     F S    UID  PID     PPID    C   PRI   NI   ADDR   SZ     WCHAN     TTY      TIME      CMD

      S                         -          wait      pts/    ::     bash

      R                         -           -         pts/    ::     ps

看一下上面的选项都指的什么
    PID :   进程号
    PPLD:   父进程的进程号
    TTY :   进程启动的终端
    STAT :  进程当前状态(S休眠状态,D不可中断的休眠状态,R运行状态,Z僵死状态,T停止)
    NI :    进程优先级
    TIME:   进程自从启动以后启用CPU的总时间
    COMMAND/CMD: 进程的命令名
    USER:    用户名
    %CPU:   占用CPU时间和总时间的百分比
    %MEM:  占用内存与系统内存总量的百分比
    实列:

     ps -u or -l 查看隶属于自己进程详细信息
root@root:~# ps -u or -l
ps -le or -aux 查看所有用户执行的进程的详细信息
root@root:~# ps le or -aux
ps -aux --sort pid 可按进程执行的时间、PID、UID等对进程进行排序
root@root:~# ps -aux --sort pid
ps -uU fnngj 查看某个用记启动的进程
root@root:~# ps -uU fnngj
ps -le | grep init 查看指定进程信息
root@root:~# ps -le | grep init

kill终止进程
    在winddow下面,我们要结束一个进程,最简单的方式就是关闭这个程序,相应的进程也会随之结束,遇到不能关闭的情况。会打开任务管理器结果掉。那么在linux下如果做呢?我们可以使用kill命令来终止进程。
    为什么要杀死进程?
    * 该进程点用了过多的CPU时间
    * 该进程缩住了一个终端,使其他前台进程无法运行
    * 运行时间过长,但没有预期效果
    * 产生了过多到屏幕或磁盘文件的输出
    * 无法正常退出
    kill用法:
    关闭进程:kill  [进程号]

  root@root:~# kill -l

     ) SIGHUP    ) SIGINT    ) SIGQUIT    ) SIGILL    ) SIGTRAP

     ) SIGABRT    ) SIGBUS    ) SIGFPE    ) SIGKILL    ) SIGUSR1

     ) SIGSEGV    ) SIGUSR2    ) SIGPIPE    ) SIGALRM    ) SIGTERM

     ) SIGSTKFLT    ) SIGCHLD    ) SIGCONT    ) SIGSTOP    ) SIGTSTP

     ) SIGTTIN    ) SIGTTOU    ) SIGURG    ) SIGXCPU    ) SIGXFSZ

     ) SIGVTALRM    ) SIGPROF    ) SIGWINCH    ) SIGIO    ) SIGPWR

     ) SIGSYS    ) SIGRTMIN    ) SIGRTMIN+    ) SIGRTMIN+    ) SIGRTMIN+

     ) SIGRTMIN+    ) SIGRTMIN+    ) SIGRTMIN+    ) SIGRTMIN+    ) SIGRTMIN+

     ) SIGRTMIN+    ) SIGRTMIN+   ) SIGRTMIN+   ) SIGRTMIN+   ) SIGRTMIN+

     ) SIGRTMIN+   ) SIGRTMIN+   ) SIGRTMAX-   ) SIGRTMAX-   ) SIGRTMAX- 

     ) SIGRTMAX-   ) SIGRTMAX-   ) SIGRTMAX-    ) SIGRTMAX-    ) SIGRTMAX-

     ) SIGRTMAX-    ) SIGRTMAX-    ) SIGRTMAX-    ) SIGRTMAX-    ) SIGRTMAX-

     ) SIGRTMAX-    ) SIGRTMAX

我们看到每个编号对应一个含义,如 9) SIGKILL ;9标注的是SIGKILL ,那么我们可用9来终止进程。
    关闭进程:
    kill -s 9 [进程号]  (强行关闭)
    kill -9   [进程号]  (强行关闭)
    上面的两种形式都可以强行关闭进程。
    重启进程:
    有时候我们需要把进程重新启动一下,可以下面的命令完成。
    kill -1  [进程号]  (重启进程)

 root@root:~# kill -     重启PID为3567的进程

关闭图形程序:
    关闭图形程序: xkill
    当你在终端下输入这个命令时,你的鼠标会变成一个小叉子,你只去点你想要关闭的窗口就可以关闭了
    其它:
    结束所有进程:    killall
    查找服务进程号: pgrep  [服务名称]
    关闭进程:          pkill    [进程名称]
    
    一个存放内存中的特殊目录/proc
    这个目录比较特殊,他并不在我们磁盘上,而在我们的内存当中;当前系统运行的所有进程都动态的存放在这个目录中。

     root@root:~# ls /proc

           dma net

           driver pagetypeinfo

           execdomains partitions

           fb sched_debug

           filesystems schedstat

           fs scsi

           interrupts self

           iomem slabinfo

     ……
    

上面每个编号就是以我们当前进程PID所命令的目录名。
    当然,当前目录下也存放了一些我们系统的信息
    查看我们当前cpu的信息

  root@root:~# cat /proc/cpuinfo

     processor : 

     vendor_id : GenuineIntel

     cpu family : 

     model : 

     model name : Pentium(R) Dual-Core CPU T4500 @ .30GHz

     stepping : 

     cpu MHz : 2294.000

     cache size :  KB

     fdiv_bug : no

     hlt_bug : no

     f00f_bug : no

     coma_bug : no

     fpu : yes

     fpu_exception : yes

     cpuid level : 

     wp : yes

     flags : fpu vme de pse tsc msr pae mce cx8 apic mtrr pge mca cmov

     pat

     pse36 clflush dts acpi mmx fxsr sse sse2 ss nx constant_tsc up arch_perfmon

     pebs

     bts xtopology tsc_reliable aperfmperf pni ssse3 hypervisor dts

     bogomips : 4588.00

     clflush size : 

     cache_alignment : 

     address sizes :  bits physical,  bits virtual

     power management:

查看内存信息

 root@root:~# cat /proc/meminfo
 MemTotal:  kB

     MemFree:  kB

     Buffers:  kB

     Cached:  kB

     SwapCached:  kB

     Active:  kB

     Inactive:  kB

     Active(anon):  kB

     Inactive(anon):  kB

     Active(file):  kB

     Inactive(file):  kB

     ……
 root@root:~# cat /proc/partitions
     major minor #blocks name

        sda

        sda1

        sda2

        sda5

我们学过操作系统原理的同学都知道,我们系统在执行程序时有会先后顺序的,但为什么我们的电脑可以边听音乐,边聊QQ,边上网,甚至还可以同时挂几个游戏。因为我们CPU运行超快。他可以把每个程序的进程排好队,这个执行一下,那个执行一下。所以,我们会觉得各种程序是并行运行的。
    当然,进程也会分个快慢缓急的,所以要对进程分个优先级。同学们在食堂排队打饭,总理来了,这优先级多高啊。同学们纷纷让开,先给总理打。
    * 优先级取值范围为(-20,19)
    linux给我们提供的优先级的范围为-20到19,我们启动一个进程时,默认的优先级为0 ,-20的优先级为最大,或者说最高。当然,我们在设置的时候可以写-30,但系统默认为-20.

指定程序的运行优先级
    格式:nice -n command
    例如:nice --5 command
    renice 命令
    改变一个正在运行的进程的优先级
    格式: renice n pid
    例如:renice -5 777
    例子:

 [root@bogon cron]# ps -le
[root@bogon cron]# renice - [PID]

nohup命令可以在用户退出时继续执行某一进程
    一般的命令在用户退登录后就停止执行了,nohup命令可以使进程在用户退出登录后仍旧继续执行,nohup命令将执行后的数据信息和错误信息默认存储到文件nohup.out中
    格式:
    nohup program &
    例子:

 [root@bogon cron]# nohup find / -name init* > /hzh/test/find.init. &

如果我们没指定/hzh/test/find.init.20120520这个保存位置的话,系统默认会把查询的结果放到nohup.out的文件中。我们一般不会去使用默认方式保存。
进程的挂起与恢复
    当我们执行一条命令时,发现太慢或输出内容太多,最常用到的做法就是终止(ctrl+c),那么挂起呢?通俗一点就是暂停呗!^_^!!
    进程中止(挂起)和终止
    挂起(ctrl+z)
    终止(ctrl+c)

     [root@bogon ~]# find / -name init* > /hzh/test/find.init.
[]+ Stopped find / -name init* >/hzh/test/find.init.

被暂停的进程会提示我们Stopped
    小知识:系统中有两种运行的进程,我们在前台是看不到的。一种是后台执行的命令,一种就是被暂停的。那我们通过什么方式查看被暂停和后台执行的进程呢?
    查看被挂起的进程(jobs)
    进程的恢复:
    恢复到前台继续运行(fg)
    恢复到后台继续运行(bg)

     [root@bogon ~]# jobs     通过jobs命令可以查看后被暂停的进程
[]+ Stopped find / -name init* >/hzh/test/find.init.
[root@bogon ~]# fg fg会将暂停的进程恢复到前台继续执行。 find / -name init* >/hzh/test/find.init. [root@bogon ~]# bg bg会将暂停的进程恢复到后台继续执行 []+ find / -name init* >/hzh/test/find.init. &

通过top命令查看进程
    top命令与前面介绍的ps命令相似,已经介绍了ps,为什么还要top?top有它自己的优点呢。它比ps显示的信息更详细。而且是动态的噢,信息是在不断变化的噢!

   [root@bogon ~]# top

     top - :: up  min,  user, load average: 0.00, 0.04, 0.06

     Tasks:  total,  running,  sleeping,  stopped,  zombie

     Cpu(s): 0.3% us, 0.3% sy, 0.0% ni, 99.3% id, 0.0% wa, 0.0% hi, 0.0% si

     Mem: 1034536k total, 232864k used, 801672k free, 60188k buffers

     Swap: 1052248k total, 0k used, 1052248k free, 118692k cached

     PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND

      root      S 0.3 0.8 :05.44 X

      root      S 0.3 0.2 :00.26 sshd

      root      R 0.3 0.1 :00.45 top

      root      S 0.0 0.1 :00.97 init

      root RT     S 0.0 0.0 :00.00 migration/

      root      S 0.0 0.0 :00.00 ksoftirqd/

      root  -    S 0.0 0.0 :00.03 events/

      root  -    S 0.0 0.0 :00.01 khelper

      root  -    S 0.0 0.0 :00.00 kthread

      root  -    S 0.0 0.0 :00.00 kacpid

      root  -    S 0.0 0.0 :00.01 kblockd/

      root      S 0.0 0.0 :00.00 khubd

      root      S 0.0 0.0 :00.00 pdflush

      root      S 0.0 0.0 :00.18 pdflush

      root      S 0.0 0.0 :00.00 kswapd0

      root  -    S 0.0 0.0 :00.00 aio/

      root      S 0.0 0.0 :00.00 kseriod

常用选项:
    d :   指定刷新的时间间隔
    c :   显示整个命令而不仅仅显示命令名
    在命令运行的时候按键盘d,会出现如下提示要求你输入刷新的间隔时间
    Change delay from 3.0 to: 10(秒)
    常用命令:
    u :   查看指定用户的进程
    k :   终止执行中的进程
    h or ?   获得帮助
    r:      重新设定进程优先级
    s:    改变刷新的时间间隔
    W:  将当前设置写入~/.toprc文件中

计划任务

我们在系统的管理中,很多时候不是及时的去操作,比如对某一网站数据的备份,备份的过程需要占用大量的系统资源,凌晨三四点的时候系统访问用户最少,系统最空闲。但我们的系统的系统管理员总不能老那个时间爬起来操作吧。
    计划命令分一次性计划和周期性计划。比如我要在今年10月1结婚,这是一次性的计划。不能每年的10月1结婚吧,真有女女愿意结,咱经济上也吃不消呀。睡觉就是周期性的计划。比如,我给自己规定每天晚上的11点半睡觉。那么到时间我就上床睡觉。
    at    安排作业在某一时刻执行一次
    batch  安排作业在系统负载不重时执行一次
    cron    安排周期性运行的作业
    一次性计划at和batch
    at命令指定时间的方式
    绝对计时方法:

     midnight noon teatime
hh:mm [today]
hh:mm tomorrow
hh:mm 星期
hh:mm MM/DD/YY

相对计时方法:

     now+n minutes
mow+n hours
now+n days

用法:
    指定在今天下午17:30执行某命令(假设现在时间是下午14:30,2012年1月11日)
    命令格式:

     at :30pm
at :
at : today
at now+ hours at now+ minutes at : 12.1. at : 1.11.
 [root@bogon ~]# at now+ minutes

     at>

我们定的时间是5分钟之后,现在可以在at下面输入各种任务,保存!5分钟之后执行;不过,我们需要注意,在用命令时最好写命令的绝对路径,为了安全。

     [root@bogon ~]# at now+ minutes

     at> /usr/bin/wall < /etc/motd    做一个广播,把etc/motd 文件广播出去

     at>                   可以继续写其它的计划

     at> <EOT>

     job  at -- :      ctrl+d保存计划并退出

是否还担心我们的计划是否启动,通过下面两个命令查看at进程是否正常启动

    [root@bogon test]# at -l

      -- : a root

     [root@bogon test]# atq

      -- : a root

如果真的没有启动的话,可以通过手工方式重新启动一下

  [root@bogon ~]# /etc/rc.d/init.d/atd start

删除at计划任务

 [root@bogon test]# at -d

查看at计划任务

 [root@bogon test]# ls /var/spool/at/

batch命令
      作用:
        安排一个或多个命令在系统负载较轻进运行一次(一般情况下负载较轻指平均负载降到0.8以下)
        使用方法同at
    周期性计划命令crontab
      作用:用于生成cron进程所需要的crontab文件
      crontab的命令格式
      crontab {-l|-r|-e}
      -l   显示当前的crontab
      -r   删除当前的crontab
      -e   使用编辑器编辑当前crontab文件
    好多人都觉得周期计划任务设置起来比较麻烦,其实我们只要掌握规律就很好设置。
    crontab -e

    规则:  把知道的具体的时间添上,不知道的都添加上*
分钟 小时 天 月 星期 命令/脚本
假如,我们每天早上4点要做一下操作,以下面方式表示:
分钟 小时 天 月 星期 命令/脚本
* * * * [具体的操作]
假如,我们每周一和三下午的6点要做一下操作,以下面方式表示:
分钟 小时 天 月 星期 命令/脚本
* * * , [具体的操作]

案例:在上学的时候都有上机课,周一到周五,下午5点30上课结果。我们需要在5点30发一个通知,5点45自动关机。设定计划任务需要分两步完成,第一步提醒,第二步关机
    分钟   小时    天   月    星期    命令/脚本
    30     17      *    *    1-5    /usr/bin/wall < /hzh/test/guanji.wall
    45     17      *    *    1-5    /usr/bin/shudown -h now
    操作方法:

     [root@bogon test]#  crontab -e    回车会进入一个vi文本中
根据我上面介绍格式编写内容,然后保存退出
crontab: installing new crontab 表示创建计划成功
通过下面方式进行查看计划:
[root@bogon test]# cd /var/spool/cron
[root@bogon cron]# ls
root
[root@bogon cron]# cat root
* * - /usr/bin/shudown -h now