进程

时间:2019-04-16 23:59:05  来源:igfitidea点击:

什么是进程

Linux是一个多用户(多个用户可以登录Linux并共享其资源)和多任务操作系统。这意味着您可以运行多个命令并一次执行多个任务。

例如,您可以编写一个c程序,同时在后台收听mp3或者使用P2P下载文件。

  1. 进程是执行特定任务的程序(或用户键入的命令)。
  2. 在Linux中,当您启动一个进程时,会给它一个惟一的编号,称为PID或进程id。
  3. pid从0到65535。
  4. 总是将PID 1分配给init进程,它是启动时启动的第一个进程。使用命令ps -C init -o pid=,cmd可以查看

如何查看进程

可以您使用ps命令、pstree命令和pgrep命令来查看当前的进程。

ps -查看进程

查看当前进程

ps
ps aux | less
ps aux | grep "process-name"
ps aux | grep "httpd"
ps alx | grep "mysqld"

pstree -显示进程树

pstree

pgrep—查找进程

pgrep查看当前正在运行的进程,并列出与筛选条件相匹配的进程id。

列出属于alice的php-cgi进程。

pgrep -u alice php-cgi

列出tom或kat拥有的进程。

pgrep -u tom,kat

父进程和子进程

  1. 父进程是一个已经创建了一个或多个子进程的Linux进程。
  2. 一个进程可以派生出一个子进程 即创建一个子进程。
    • 例如,如果用户在shell提示符下键入ls命令。
    • shell执行ls命令。
    • Linux内核将复制shell的内存页,然后执行ls命令。
  3. 在UNIX中,每个进程都是使用fork和exec方法创建的。但是,这种模型造成了系统资源的浪费。
  4. 在Linux下,fork方法是使用即写即拷的页面来实现的,因此它的唯一损耗是复制父级的页表以及为子级创建惟一的任务结构所需的时间和内存。
  5. 在创建新进程时,即写即拷模型避免创建不必要的结构副本。
    • 例如,用户在shell提示符下键入ls命令。
    • Linux内核将派生并创建bash的子进程或子进程。
    • 在本例中,bash是父命令,ls命令是子命令。换句话说,ls命令与bash shell指向相同的内存页。
    • 然后,子进程使用写时复制来执行ls命令。

进程状态

每个Linux进程都有自己的生命周期,比如创建、执行、终止和删除。
每个进程都有自己的状态来显示当前进程中正在发生的事情。

进程的状态,可以是以下之一:

D(不可中断睡眠)——进程处于睡眠状态,直到I/O等事件发生后才能恢复。例如,进程foo是一个等待键盘中断的进程。
R(运行中)——进程正在运行或执行。
S(睡眠中)进程没有运行,正在等待一个事件或信号。
T(跟踪或停止)-进程被诸如SIGINT或SIGSTOP之类的信号停止。
Z(zombie僵死或defunct失灵的,死的)——标记为<defunct>的进程是死进程(所谓的“zombie僵尸”),它们之所以存在是因为它们的父进程没有正确地销毁它们。如果父进程退出,这些进程将被init销毁。

Linux如何查看进程的状态

 ps -C processName -o pid=,cmd,stat

示例-显示lighttpd、php-cgi和firefox-bin进程的状态,

ps -C firefox-bin  -o pid=,cmd,stat
ps -C lighttpd -o pid=,cmd,stat
ps -C php-cgi -o pid=,cmd,stat

终止进程

通常,所有进程都自行终止。

例如,下面的find命令将在完成任务时终止:

find /home -name "*.c" 2>error.log 1>filelists &

也可以通过按 CTRL+C终止前台进程。它将向进程发送一个TERM信号。

要终止不需要的后台进程,使用带有 -9信号的kill命令:

kill -TERM pid
kill -KILL pid
kill -9 pid

要停止(暂停)一个前台进程,按 CTRL+Z
要恢复前台进程,使用fg命令:

fg jobid
fg 1
fg %

%表示上一个放到后台运行的进程。