• linux进程管理


    概述

      内核的功用:进程管理、文件系统、网络功能、内存管理、驱动程序、安全功能

      进程相关:进程的创建(fork-exec)-->进程优先级(pri(0-139),nice)-->进程内存(Page frame)-->IPC(Inter Process Communication)-->进程类型(daemon,用户进程)-->进程状态-->进程分类(CPU-Bound,IO-Bound)

      进程查看及管理工具:pstree, ps, pidof, pgrep, top, htop, glance, pmap, vmstat, dstat, kill, pkill, job, bg, fg, nohup,lsof,fuser

    1.进程和程序

    程序 (program):

      通常为 binary program ,放置在储存媒体中 (如硬盘、光盘、软盘、磁带等), 为实体文件的型态存在;

    进程 (process):

      程序被触发后,执行者的权限与属性、程序的程序代码与所需数据等都会被加载内存中, 操作系统并给予这个内存内的单元一个标识符 (PID),可以说,进程就是一个正在运作中的程序。

      我们知道我们登录linux系统都是执行的/bin/bash,然后系统依据UID/GID (/etc/passwd) 给我们分配一个PID,然后由进程衍生出来的其他进程在一般状态下,也会沿用这个进程的相关权限的!这也是为什么linux能够为每个用户创建一个独立的环境的原因。在你登录系统的那一刻,就决定了你的操作权限。

    2.父进程和子进程

      fork-and-exec:linux系统中进程都会藉由父进程以复制 (fork) 的方式产生一个一模一样的子进程, 然后被复制出来的子进程再以 exec 的方式来执行实际要进行的程序,最终就成为一个子进程的存在。

    示例:

    ps:第一个 bash 的 PID 与第二个 bash 的 PPID 都是2197啊, 因为第二个bash 是来自于第一个所产生的嘛!

    3.工作管理

      当我们登录到linux系统时,就意味着我们接下来的每个工作都是目前 bash 的子进程,亦即彼此之间是有相关性的。 我们无法以 job control 的方式由 tty1 的环境去管理 tty2 的bash !

    什么情况下使用job control:

    1. 这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash);
    2. 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
    3. 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
    4. 背景中『执行』的进程不能等待 terminal/shell 的输入(input)

    管理方法:

    1. 直接将指令丢到背景中『执行』的 &
    2. 将『目前』的工作丢到背景中『暂停』: Ctrl+z
    3. 观察目前的背景工作状态: jobs [-lrs]
    4. 将背景工作拿到前景来处理: fg %jobNumber
    5. 让工作在背景下的状态变成运作中: bg %jobNumber

    脱机管理(nohup [ ] &)

    示例:

    #!/bin/bash
    /bin/sleep 500s
    /bin/echo "I have slept 500 seconds."
    
    ......                       
    [root@node1 test]# chmod a+x sleep500s.sh 
    [root@node1 test]# nohup ./sleep500s.sh &
    [1] 2733
    [root@node1 test]# nohup: ignoring input and appending output to `nohup.out'
    
    [root@node1 test]# exit
    logout

    退出当前tty后,再进行登录,通过pstree查看 (./sleep500s.sh &)

    [root@node1 ~]# pstree
    init─┬─abrtd
         ├─acpid
         ├─atd
         ├─auditd───{auditd}
         ├─console-kit-dae───63*[{console-kit-da}]
         ├─crond
         ├─dbus-daemon
         ├─hald─┬─hald-runner─┬─hald-addon-acpi
         │      │             ├─hald-addon-inpu
         │      │             └─hald-addon-rfki
         │      └─{hald}
         ├─login───bash
         ├─master─┬─pickup
         │        └─qmgr
         ├─5*[mingetty]
         ├─rsyslogd───3*[{rsyslogd}]
         ├─sleep500s.sh───sleep
         ├─sshd───sshd───bash───pstree
         └─udevd───2*[udevd] 
    [root@node1 test]# ls
    nohup.out  sleep500s.sh

    ps:由于我们的程序最后会输出一个讯息,但是 nohup 与终端机其实无关了, 因此这个讯息的输出就会被导向『~/nohup.out 』 

  • 相关阅读:
    产品小细节中的大体验
    产品经理的四点思考:不该简单满足用户需求
    产品经理的十大顶级错误
    SQL Server数据库大型应用解决方案总结
    java中public static void main(String[] args)中String[] args代表什么意思?
    异常处理1
    java中的String
    华为2013年西安java机试题目:如何过滤掉数组中的非法字符。
    2用java代码实现冒泡排序算法(转载)
    1用java实现冒泡排序算法以及解决的几个小问题。
  • 原文地址:https://www.cnblogs.com/chbo/p/7064861.html
Copyright © 2020-2023  润新知