linux进程管理
Posted 谁能不挨刀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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:
- 这些工作所触发的进程必须来自于你 shell 的子进程(只管理自己的 bash);
- 前景:你可以控制与下达指令的这个环境称为前景的工作 (foreground);
- 背景:可以自行运作的工作,你无法使用 [ctrl]+c 终止他,可使用 bg/fg 呼叫该工作;
- 背景中『执行』的进程不能等待 terminal/shell 的输入(input)
管理方法:
- 直接将指令丢到背景中『执行』的 &
- 将『目前』的工作丢到背景中『暂停』: Ctrl+z
- 观察目前的背景工作状态: jobs [-lrs]
- 将背景工作拿到前景来处理: fg %jobNumber
- 让工作在背景下的状态变成运作中: 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 』
以上是关于linux进程管理的主要内容,如果未能解决你的问题,请参考以下文章