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 』 

原文地址:https://www.cnblogs.com/chbo/p/7064861.html